【C++】template 統合スレ -- Part5

C++ のジェネリックプログラミングの話をしましょう。
以下のスレッドを統合するスレです。
STLスレッド
Part1 http://pc.2ch.net/tech/kako/1004/10042/1004287394.html
Part2 http://pc3.2ch.net/tech/kako/1026/10267/1026793823.html

【C++】Boost使い集まれ!
http://pc3.2ch.net/test/read.cgi/tech/1033830935/ (html化待ち?)

Generic Programming with C++ Template
http://pc.2ch.net/tech/kako/1008/10085/1008593126.html
【C++】template 統合スレ -- STL/Boost/Loki, etc.
http://pc2.2ch.net/test/read.cgi/tech/1037795348/
【C++】template 統合スレ -- Part2
http://pc2.2ch.net/test/read.cgi/tech/1047978546/ (html化待ち)
【C++】template 統合スレ -- Part3
http://pc5.2ch.net/test/read.cgi/tech/1066493064/
【C++】template 統合スレ -- Part4
http://pc5.2ch.net/test/read.cgi/tech/1083550483/
関連スレ、その他リンクは >>2-5 あたりに。
重複。
参考図書

・テンプレート
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/
Modern C++ Design
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/
C++ Template Metaprogramming
http://boost-consulting.com/mplbook/

・Boost関連
Boost C++ Libraryプログラミング
http://www.amazon.co.jp/exec/obidos/ASIN/4798007862/
The Boost Graph Library
http://www.amazon.co.jp/exec/obidos/ASIN/0201729148/

・STL
Generic programming―STLによる汎用プログラミング
http://www.amazon.co.jp/exec/obidos/ASIN/4756134416/
Effective STL
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/
STLによるコンポーネントデザイン
http://www.amazon.co.jp/exec/obidos/ASIN/475613422X/
Boost C++ Libraryプログラミング…3点
【C++】template 統合スレ -- Part4
http://pc5.2ch.net/test/read.cgi/tech/1091520997/l50

こっちの方が先に建ったので誘導。
重複じゃなくて番号間違えです。すいません。
で、どっちなんだろう
こっちが本スレ
11デフォルトの名無しさん:04/08/03 19:24
age
12age:04/08/06 02:00
age
13デフォルトの名無しさん:04/08/06 08:11
hage
そろそろ相談室に統合でいいんじゃねえの?いくつもいらんだろ。
>>14
スレの流れ的には問題ないと思う。
ただ、今あるスレ建てテンプレを相談室のテンプレにそのまま追加でよいのかが気になる。
16デフォルトの名無しさん:04/08/08 19:44
std::cout ってスレッドセーフなんでしょうか?

今まで使ってなかったんですが Effective C++ に「<stdio.h> ではなく <iostream> を使おう」
という記述があり力強く使うことを推奨してるんで使ってみようかな
と考えているんですが、その構造上どう考えてもスレッドセーフじゃない気がするんですが・・・
>>16
cstdioはスレッドセーフなの?
スレッドセーフじゃなくなってしまうであろう構造とは具体的にどこ?
1816:04/08/08 20:31
>>17
> 構造とは具体的にどこ?
・std::cout の実体がひとつしかない
・std::cout がバッファリングしている

実際にやってみたところ、下記のような感じで見事に出力がぶっ壊れました
std::cout 版の出力
Thread 実行中((thread1)
Thread 師hread2)
Thread 実タ行中 (thread1)
Th行中 (thread2)

printf 版の出力
Thread 実行中 (thread1)
Thread 実行中 (thread1)
Thread 実行中 (thread2)
Thread 実行中 (thread2)

コンパイラVisual C++、STLはVisual C++にはいっていたやつ
でしか試してないんですが、別な環境だと大丈夫だったりするんでしょうか
1916:04/08/08 20:34
ちなみにソースはこんな感じです
(実験用コードなんで無限ループさせてるのは平にご容赦)

DWORD ThreadEntry( void* param )
{
  std::string unique = reinterpret_cast< char* >( param );
  while ( true )
  {
    std::cout << "Thread 実行中 (" << unique << ")" << std::endl;
//   printf( "Thread 実行中 (%s)\n", unique.c_str() );
  }

  return 0;
}

それぞれ引数 "thread1" "thread2" で2本スレッドを起動しました。
>>18
> ・std::cout の実体がひとつしかない
> ・std::cout がバッファリングしている

そんなのはcstdioでも同じこと。stdoutの実体は一つだろうし、バッファリングもあり得る。
スレッドセーフではないと判断する理由としてはおかしい。

>>19
> std::cout << "Thread 実行中 (" << unique << ")" << std::endl;

この行はstd::coutへの出力を3回に分けて実行しているなど、
やっていることが異なってしまっているので、比較のためには
 std::cout << ("Thread 実行中 (" + unique + ")\n");
などに変えて試してみる必要がある。

まぁ出力結果を見る限り、たぶんダメなんだろうな。
スレッドに対して、コードが安全なのか、はたまたリソースが安全なのかが理解できてないヤシが居る悪寒。
>>21
スレッドに対してコードが安全ってどういうこと?
リソース(この場合cout)に対する排他は基本的に使う側が決めることだろ。
それとコードの中身が 再入可能(reentrant) であるということは別問題。

cout をいつからいつまで使うかを決めるのは設計者の仕事ってことだよ。
>>23
コードの中身って、coutの実装のことかい?
あと、それら2つの問題の区別が>>16-の話のどこにどう関係有るの?
>>24
通りすがりで>>16は見てなかったのですまん。
2623:04/08/08 22:13
すまんついでに行っとくが、スレッドセーフかどうかは排他をかける対象を
いつからいつまで使いたいのか考えればすぐわかることだよ。
>>26
意味がわかりません。
>>27
標準出力に対する排他とコードがスレッドセーフかどうかを混同するなってこと。

こんなこともわからないようならプログラム書くの辞めたほうがいいよ。
あーぁムキっちゃった・・・
>>26,>>28
たとえば、
 排他をかける対象:標準出力
 いつからいつまで使いたいのか:プログラム起動から終了まで
これだけの情報で「スレッドセーフかどうか」が「すぐわかる」と言うのか?
そんなわけないだろ。
>>26の意味が>>28だっていうのも、飛躍しすぎじゃない?

「コード」「排他」「スレッドセーフ」の意味が
それぞれ曖昧なままなのが噛みあわない原因だと思う。
3123:04/08/08 23:03
定義1:coutが呼ばれてる間、出力画面を壊さないことが保証されていることをスレッドセーフという。
定義2:coutが呼ばれてる間、バッファを壊さずに安全にメソッドを実行できるることをスレッドセーフという。

さぁどっちだ。
「coutが呼ばれてる間」ってなんだよ?
3323:04/08/08 23:34
すまんな。 operator << でいいか?
でとっちなんだよ。
>>33
あのな、定義ってのは既に定義された言葉で組み立てないと意味がないんだよ。
雑談だから多少は大目に見るとしても、
「画面を壊す」「バッファを壊す」それぞれの意味くらいは
もうちょっと説明してもらわないと、エスパーにしかわからないよ。
ひとことも「スレッド」が出てこない「スレッドセーフ」の定義も、たぶん無理だと思うし。

だいたい「スレッドセーフ」なんて言葉は文脈によって変わるから、
話す人がきちんと定義しないと会話にならない。
相手に決めさせていいものじゃないはず。
>>16-の流れでのスレッドセーフとは、

シングルスレッド環境における一回のoperator<<呼び出しによる出力結果を「正しい出力」として、
マルチスレッド環境においてそれぞれのoperator<<の呼び出しに対して、
「正しい出力」が互いに割り込まれずに得られること。

という感じでいいんじゃないだろうか?
つーか、iostreamやprintfでどういう順番で表示されるかなんてOSの標準出力の仕様だと思うんだが。
>>34
同意。

ついでに>>16の質問を
「std::cout ってスレッドセーフなんでしょうか?」
ではなく
「std::basic_ostream<> ってスレッドセーフなんでしょうか?」
に修正しておいた方がいい気がする。
これでもけっこういい加減ではあるが、だいぶましかと。
3823:04/08/09 00:36
どこまで安全かよく考えろってことでよろしいでしょうか?
>>38
だから、それじゃエスパーにしか伝わらないって言ってんだろ。
もうちょっと自分の文章を客観的に見直してから書き込め。
それができないなら、もう寝たほうがいい。
4023:04/08/09 01:04
>>39
エスパーってなんですか?
書き込みに現れていない筆者の意図でも正しく読み取ることができる超能力者。
4223:04/08/09 01:22
それでは>>38の書きこみに現れてない意図とな何ですか?
まず、coutの仕様として
あるスレッドがあるバイト列を突っ込むとその通りの順序で出力される、
ということしか決めてないんじゃないの?
operator<< 1回を単位として出力とか、そんなことはわからないんじゃない?

で、スレッドセーフ性は、複数のスレッドから任意のタイミングでcoutにアクセスしても、
こけたりせずに上の仕様を満たした正常動作を行なう、というだけなのでは。
>>18の出力って別にブッ壊れてないよね。
適当にマージされてるから画面は乱れるけど、1つのスレッドが出してる出力に関しては正しい順序で出てるじゃない。
それをスレッドセーフじゃないと言うのは自分にはかなり奇異に映る。

16の期待する動作がしたいのだったら、ロックとflush()を使って
何とかせよ、ということだと思うのだけど。
4423:04/08/09 01:35
>>43

>で、スレッドセーフ性は、複数のスレッドから任意のタイミングでcoutにアクセスしても、
>こけたりせずに上の仕様を満たした正常動作を行なう、というだけなのでは。
ここでいうところの「こける」とは何?画面出力が乱れること?それともプログラムが異常終了するってこと?
>>44
未定義動作に突入しない、仕様通りの動作を行なうことを「こけない」と表現してます。
こける動作の代表が異常終了だけど。

画面出力が乱れるのは仕様通りですよね。
>>16
Sun C++のiostreamなら、MT-Safe。
http://docs.sun.com/db/doc/802-3045/6i6vgg2rk?l=ja&a=view
STLPortもok
4823:04/08/09 02:06
M$の説明のどこをどう読んでも俺にはライブラリが再入可能を保証してるだけにしかみえんが。
http://www.microsoft.com/JAPAN/developer/library/vccore/_core_library_support_for_multithreading.htm

それによく見ろよ。>>19のソースを見る限りprintfがスレッドローカルの関数を呼んでるのに、coutは親
スレッドから渡さたものを使ってる。でこれでcoutはスレッドセーフじゃないとか言われてもとっても困る。

16のやり方がまちがってるじゃん。
スレッドローカルの関数 : unique.c_str()
親スレッドから渡されたもの : unique

おまえもう良いから消えナ
5023:04/08/09 02:15
すまん。きえるわ。おやすみ。
5123:04/08/09 02:20
ちょっとまて。c_str()の動作はどうなんだ。
リテラルを出力するとどうなる。
>>51 何を心配しているのか知らんが、もう寝ろ。
5323:04/08/09 02:36
>>52
そうするわ。おやすみ。
>>52
最後にはそうやって逃げるんだねw
当たり前だろ
何が?w
5716:04/08/10 02:53
まことに申し訳ございません。std::cout はスレッドセーフでした。
変なマージのされ方をしていた原因は単にシングルスレッド用のライブラリをリンクしていたためでした。

とはいうものの
printf( "hoge %s\n", str );
 ↓
std::cout << "hoge " << str << std::endl;
では >>20 のご指摘通り printf では一回で出るものが std::cout では複数回になってしまうため
boost の format みたいなの作って何とかするか stdio.h を使い続けることにします。

どうもお騒がせしました。
>>57
std::ostringstream でまとめてから出力すればどうか。

std::ostringstream os;
os << "hoge " << str << std::endl;
std::cout << os.str();
59デフォルトの名無しさん:04/08/10 10:05
BoostがC++標準ライブラリの一部になるのはいるですか。
60デフォルトの名無しさん:04/08/10 10:07
BoostにC++標準ライブラリが一部へなるのはいるですか。
はいここにいます
浮動小数点スレに書いた話だがテンプレートなんでこっちにも。
C++のテンプレート・メタ・プログラミングを利用して
コンパイル時にdoubleやfloatの計算ができるライブラリを作ってみた。

取り敢えずはコンパイル時計算によるFFTコードの最適化という自分の研究のために作ったので
今のところ四則演算と整数との変換とsinhp()の計算しかまだ実装してないし、
丸めは直近だけだしNaNとか非正規化数とか実装してないんだが…。
ちゃんと整備したら使う人いそうかな?

(…これしかしもしかして車輪の再開発だったりしないだろうな?(不安))
> コンパイル時にdoubleやfloatの計算ができるライブラリを作ってみた。

あやしいな。
 struct pi { static const double value = 3.14・・・・
とかやってるのか?
>>63
それができてついでにstatic connst doubleも定数式として計算してくれていれば
苦労は少なかったんですけどね。
(もっというならtemplateパラメタに渡せれば根本的に解決しますが、
浮動小数点数の同値には多くの場合あまり意味がないのでそれが実現されていない理由も分ります。)
クラス/構造体にstatic const doubleなメンバはそもそも持たせられないのでして。

template<int sign, int exp, typename fraction>
struct StaticReal{
static const int s = sign;
static const int e = exp;
typedef fraction f;
};

って感じです(実際は精度を指定するテンプレート・パラメータとかいろいろありますが)。
小数部をあらわすfractionが基本型でなく
typedefになっているのはIEEE準拠のdoubleの実装には
64bitを超える結果を返す正確な整数演算が必要だったため、
それもクラス・テンプレートで実装する必要があったからです。

具体的な各浮動小数点数値はこのテンプレートの特殊バージョンとして与えられます。
>>63
今はpi=3でつ! おまい時代遅れでつ!
>>64

浮動小数@プログラム
http://pc5.2ch.net/test/read.cgi/tech/1045772555/477-484

でもうちょっとだけ詳しく書きました。

>>66
ドメイン名の長さ的にクリックするのが躊躇われるURLだなー。
最近のDNSやブラウザは大丈夫なんかもしれんがー。

そのうえISDNではDLが若干辛い。
>>67
宣伝も良いけどさ、踏み込むならスレ統一しろよ
sinhpってはいぱぼりっくかと思った
いや それだけですが
>>68
現状では宣伝できるほど整備できてないんでアレですが。まだ公開もしてないし。

浮動小数点とテンプレートという普段はあまりリンクしないであろうトピックに跨ってるのでどっちに絞ったものか。
個人的には浮動小数点演算の実装としての側面はあっちで、
テンプレート・メタ・プログラミングの例としての側面はこっちでと思っているのですが。
71デフォルトの名無しさん:04/08/12 18:01
>>70
別に貼らなくていいよ。無職なんだろ?悪い事はいわんから他の業界目指せよ?
>>71
誤解のないように言っておくと
まぁ求職中なのはハンドルにも書いてるとおりで本当だけど今回の話題とは別に関係ない。
単に自嘲的に名乗ってるだけ。
そもライブラリも自分で使うつもりで作ったけど別に商売目的で作ったわけではないしな。
このスレに書いたのは純粋にテンプレート・メタ・プログラミングで
浮動小数点演算を使えるようにする話がしたかったからであって
別段宣伝したいわけではないよ。
>>72
ageた上、ああいういい方する奴は
無視でOK
自嘲ハンドルってウザイよな。結局主張してるわけだし。
自嘲したけりゃ部屋で一人で勝手にしててくれって感じ。
>>74
お前も広告の裏にでも書いとけよ。な。
>>62
>ちゃんと整備したら使う人いそうかな?
います。で?
>>72
>浮動小数点演算を使えるようにする話がしたかったからであって

(´-`).。oO( 空想科学だろう… )
>>70

それってさ、
double d = 0.707; // means sin(pi/2)
って書く代わりに
double d = STATIC_SIN(3.14/2);
みたいに書けるから、ソースの可読性が上がるってこと?

それとももっと良い使い方があるの?
http://www.osl.iu.edu/~tveldhui/papers/techniques/techniques01.html#index00070
例えばここではFFTに用いるsin/cosの計算に級数展開を用いていて
即値が埋め込まれることを期待していますけれど
こういうのに使うのを想定しているんじゃないですかね?
>>79
昔からある「三角関数テーブルをあらかじめ作成しておく」ってのをtemplate programmingでやろうってことだね。
やっぱりソースの可読性くらいしかないのかな、メリットは。
あと、テーブル作成機能をソースに埋め込めるので一元管理できるとか?
>>72
能書きはいいから公開してみろよ。ソースも示せないんではただの妄想だと
思われても仕方ないぞ。
別に仕方なくはないですね。
妄想と思い込みたい人間が妄想と思い込むだけの話です :-P
まぁ妄想つーかパラレルワルドーだな。  (´ー`)y-~~
俺の世界とは接点が無い。
>>79
今回、やったこと全体としてはもうちょっと色々ありますが、
まぁ、今回開発浮動小数点演算に関しては用途は殆どそれです。
FFTのループを展開するようにメタ・プログラミングした中でFFTの回転因子の計算に使いました。
(他の色々は論文誌に投稿中のレポートの当落が
ハッキリしたらドキュメントを公表できると思います。
大雑把に言うとFFTWモドキをやりました。)

ただ級数展開をバカ正直に計算したらコンパイルがむちゃくちゃ重かった(g++2.x系)ので
最良近似で展開済みの式でsin関数は書いてしまいましたが。

>>80
テーブルで言えばコンパイル時に生成する感じになるので、
例えばFFTの場合なら要素数が変わっても対応できます。
可読性自身はC++テンプレート・メタ・プログラミングの常としてよく言って微妙なセンですが、
必要な値だけをコンパイル時に精度良く生成できるので、テーブルをメンテナンスするよりは楽でしょう。

>>81
広く一般に使える形で公開するにはやらないといけないことがまだまだあろうと思って
(とりあえず動かすということ優先だったので直したり作り足したりしないといけない部分はある。)
WWWにうpするといったことはまだしてないけれど、興味があるトピックを言ってもらえれば
関連部分のソースは出してもよかですよ?
正直このスレで何がしたいんだかわからん
うp「したいなら」すればいいし、完成させてからWEBで公開すればいいだけでは
なんかちょっと自意識過剰なんでないの
>>85
同意。

別に妄想だとかは思わないけど、珍しい話題じゃないし、どうしろと?
誰かがURL挙げてたけど、Expression Templatesとか、
計算分野でのtemplate programmingの話題は既にあるもんね。

公開するとか、技術的な質問があるとか、一緒に作りたいとかさ、何がしたいの?
厨房がただ自慢したかっただけだろ
無職だからこんな所でホイホイしてもらわないと自尊心が保てないんだよ。
研究会で発表してたが…
教授からつまはじきにされてるんだろ
91デフォルトの名無しさん:04/08/16 22:55
ソースマダー?(チンチン
ソースはどうでもいいから、人に発表するならちゃんと説明すべきことを説明して欲しい。

「詳細はまだ言えないけど、ものすごい発見をしました。」だけでは、
聞く方としたらトンデモ科学とかインチキ宗教にしか聞こえない。

それがプレゼンというものだ。
>>92
> 「詳細はまだ言えないけど、ものすごい発見をしました。」だけでは、
> 聞く方としたらトンデモ科学とかインチキ宗教にしか聞こえない。
ZeroSyncのことかー!!
>>93
なつかしい
洩れはTHcompを思い出した
>>86
珍しい話題でないということは
コンパイル時浮動小数点数値計算の前例があるということなわけですね。
ご存知ならばお教えいただきたく候。
元々見つけられなかったがために自分で書くハメに陥ったので、
既存のものがあれば利用したいです。
先行してるなら多分私のより完成度高そうですし。

>>92
掲示板環境で普通にプレゼンやったら長すぎると思うので
「~はおかしい」とか「~はどうなっとんねん?」というツッコミがあったら答えようという
Lazy evaluationでと思った訳です。
で、その出発点が>>64だったということです。
>>64のように浮動小数点数値を表すことさえ決めたら後は
アルゴリズムの方は割と正直にKnuth本の通りに
テンプレート・メタ・プログラミングの定石に従って実装しただけなんで…。

>>87-90
まぁ、なんていうか今身近に
C++テンプレート・メタ・プログラミングの話ができる友達や仲間がいないもんで
寂しいわけなんですよ。仰るとおり無職だからw。
発表に行けるほどのネタならば行けばいいんですが、
浮動小数点演算単体では「作ってみました。どうでショウ。」程度の小ネタですしね。
>>92
「ものすごい発見をしました。」ってほどのことでもない
聞いたほうも「ああ、そうやったの。ふふん。」ってくらいの軽い話題のつもりなんですが、
そんなに想像の範囲からハミ出ていますか?

----

ところで、テンプレート・メタ・プログラミング共通の話題として
デバッガとか使えない上に再帰の終了条件間違うとコンパイルが終わらなかったり
(長く待てばいつかはメモリがなくなったり再帰の深さ制限にかかって帰ってきますが)
とデバッグには苦労するわけですが、皆さんはどうしてらっしゃいますか?
何か工夫がありましたらお聞かせ下さい。

私はせいぜい展開されると存在しないメンバを参照するなど、
エラーを故意に起こすクラス・テンプレートをprint文代わりに
エラーメッセージでデバッグする程度のことしか知らなかったのですが…。
>>96
》浮動小数点演算単体では「作ってみました。どうでショウ。」程度の小ネタですしね。

子ネタでこれほどまでに引っ張れるのも大した才能だが
無職は友達いない言い訳にはならなぇべ    (´ー`)y-~~
>>98
> 無職は友達いない言い訳にはならなぇべ    (´ー`)y-~~

イヤミ過ぎてワラタ
>>98
「身近に」←これ重要。
身近な友達はC++に疎く、C++に詳しい友人・知人は遠隔地だったり忙しかったり。
当方C++に関するヨタ話をする相手に飢えている哀れな失業者なわけですよ。

まぁ、大ネタだとどうせ何らかのドキュメント書くことになるんで、
掲示板でヒョイと振るには小ネタくらいが適当かなと。
「引っ張る」に関しては話し相手に飢えた哀れな失業者としてはレスがつけばホイホイとw。

>>91
いろいろ不備があって辛うじて動くという状態なので公開するのは恥ずかしいレベルですが:
 ttp://www.nerimadors.or.jp/~kando/FFTemplate/index.html
のRealTemplateの方がそれです。
実際,コンパイル時に決定される浮動小数点演算にどれほどの需要があるんでしょうか?
四則演算程度なら最適化しないコンパイラはないだろうし,
sin,cosのコンパイル時計算(これが本命だと思いますけれど)なんて
少なくとも自分には(知識ないからですが)FFTの回転因子の計算しか用途が思いつきません.
そういう特殊用途だけしかないものにここまで大仰なフレームワークを用意する必要があるのか
自分には疑問なんですが.ぶっちゃけ展開級数をコードにべた書きしてはダメなんですか?っていう.
それに1つの浮動小数にクラステンプレートのインスタンス1つを割り当てる実装ですけれど,
これを本格的に使うと途端にインスタンス数が爆発して,
(少なくとも現在の多くのコンパイラでは)利点よりも欠点が勝るように想像するんですけれど
そこらへんはどうなんでしょうか?
これらを踏まえた上で,なおかつこのフレームワークで出来て他では出来ない
何かがあるんだとしたら,それはすごく有意義だとは思うんですが・・・
C++内じゃなくて他のプリプロセッサ使えば簡単に解決すると思うんだけどね。
たぶん楽しいとか興味とかそういった動機だと思うよ。
>>101
FFTの回転因子だって、データ長がコンパイル時に決まらないと使えない。
だからやっぱり、何に使うかよくわからない。

おもしろうそうってのには同意するけどね。
とりあえず、◆y3A2MadQ16が無職な理由はわかった。
105デフォルトの名無しさん:04/08/21 20:32
大発見できてよかったですね ;-)
友達になかなか逢えない理由も
107デフォルトの名無しさん:04/08/24 04:48
ある構造体StructAがあってその構造体をリストにする予定です。
その構造体のメンバにはポインタがあってそこにnewして文字列を保持させるつもりです。
またデストラクタでこのポインタをdeleteします。

使い方としてはこの構造体をリストにpush_backする前にローカルのStructA型の変数を用意し、
これにデータをつめ終わった後でリストにpush_backします。

ここで問題があります。このローカルの変数がスコープを外れるとメモリを開放してしまうのです。

ここで悩んだのですが、こういう場合この構造体にコピーコンストラクタと代入演算子をオーバーロードして
文字列用のメモリを作り、memcpyで文字列をコピーしてやるべきなのですか?

#CStringなどでもそうなっているのかな?
>>107
あたりまえだ。

つーか素直にstd::string使っとけ
>>108
やはりそうでしたか。サンクス。
実は文字列というかバイナリデータを入れることもあるもので。
>>109
std::vector<char> 使え。おまえのレベルではポインタは危ない。
どのレベルにいってもポインタは十分危ないですよ

boost 標準化マダー チンチン
>>110
危なくないと思うよ?別に問題点にすぐ気がついているしね。
STLを使った効率的なプログラミングに関しては確かに経験が浅いけどね。
>>107
デストラクタで明示的なリソースの破棄を必要とするクラスは、
かならずコピーコンストラクタ、代入演算子も必要とする
とおぼえておけばよし。
こういう手はいくないの?

list < ClassA* > Alist;
ClassA pA = new ClassA( "hoge" );
Alist.push_back( pA );

そもそもコンパイル通らないだろそれ
>>114
Alist.push_back(new ClassA("hoge"));
直接こうでいいだろ。
>>114
std::list<boost::shared_ptr<ClassA> > Alist;
Alist.push_back(boost::shared_ptr<ClassA>(new ClassA("hoge")));
boost::shared_ptr重い
  /⌒ヽ   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  | ゜Θ゜) < そうでもないよ。
  | ∵ つ  \___________
>>116
>>117の方がいいんじゃないか。new ClassA("hoge")が
成功したあとにAlist.push_back()が失敗したらそのメモリを
誰が回収するんだ?
>>120
大人だなあ。
でもその失敗は,メモリーのアロケーションと違ってロジックにとって致命的な予感...
122デフォルトの名無しさん:04/09/01 00:40
Microsoft Visual C++ Toolkit 2003を使っている方々に
質問です。どうやってBoostをビルドしていらっしゃいますか?
教えてください。こちらではうまくできていないので、参考に
したいです。
>cd "C:\Program Files\Microsoft Visual C++ Toolkit 2003"
>vcvars32.bat
>set MSVCDir=C:\Program Files\Microsoft Visual C++ Toolkit 2003
>cd C:\boost_1_31_0
>bjam "-sTOOLS=vc7.1" install
このようにしています。
123デフォルトの名無しさん:04/09/01 00:42
モテない男板の「これって犯罪じゃね?」スレにて業者を攻撃しております。
鯖がベルギーにあるためなかなか落ちません。援軍よろしくおねがいします。
>122
具体的にどのようにビルドできないのか教えてもらわん事にはどうしようもない。
コンパイラが見つからないのか、コンパイルでこけるのか、リンク時に失敗するのかとか。
あとエラーメッセージも。
125122:04/09/01 20:58
>>124
LINK : fatal error LNK1104: cannot open file 'msvcprtd.lib'
LINK : fatal error LNK1104: cannot open file 'msvcprt.lib'
とあるのですが、ハードディスク中を探しても出てこないのです。
スレ違いなので放置
127デフォルトの名無しさん:04/09/02 22:59
STLに使わせるallocatorクラスを作ろうと思うのですが、
文献によりますと、allocatorは同じテンプレートクラスにおいて
等価でなければならいらしいのですが、operator ==とoperator!=を定義して、
つねにtrueとfalseを返すようにしてもローカルなメンバは保持したらダメなのでしょうか?
>>127
ttp://www.kuzbass.ru/docs/isocpp/lib-utilities.html#lib.allocator.requirements

a1 == a2 の結果は "returns true iff storage allocated from each can be deallocated via the other" とされている。
データメンバを持つなら、 a1 == a2 が true にならない場合があるんじゃない?
>127
というか,標準のコンテナに食わせられるAllocatorはインスタンス毎に固有の状態を持てない,
要するにローカルなメンバは持てないという結論になります.
何故こんな厳しい制限を要求する必要があるのかについては例えば「Effective STL」の第10項が詳しいです.
130デフォルトの名無しさん:04/09/03 01:11
>>128
なぜアロケータを作るのかといいますと、某APIのメモリプールを使いたいからなので、
deallocateは常に成功します。(実際にはなにもしないので)
>>129
それで得た知識を伝授して頂ければありがたいのですが、そうくるなら、読んでみます。
>>127
rebindされたとき、データメンバはどうなるの?
>>130
秘密にされると気になる。
某APIってコレクションとかの話?
templateって、他のクラスのメソッドを呼ぶ時staticにしないといけないので
使いづらいな。型にハマると楽なんだけどな。
>>133
詳しく
>>133は、Modern C++ Design のポリシーあたりか。
あの本ってポリシーを継承してなかったっけ
だから?
あなにもチェルシーあげたい
あなたにも だった or2
「Modern C++ Design」はどれくらいで
「Ancient C++ Design」になるの?
それとも、すでになってる。
>>140
あと二週間とロスタイム分くらいで
142デフォルトの名無しさん:04/09/11 03:16:50
モダン焼きがエンシェント焼きになる頃
143デフォルトの名無しさん:04/09/13 09:07:08
VC++. NET 2005 (β版)ってtemplateのネストや
部分特殊化はokなんでしょうか?
144デフォルトの名無しさん:04/09/13 12:13:46
自分で試せよ
145強制移動:04/09/14 08:46:47
templateを使うとプラットフォームへの依存性が低減され移植性が高まります。

Linuxデスクトップ市場制覇のためには その12
http://pc5.2ch.net/test/read.cgi/linux/1094205751/481

481 名前:login:Poelina[chage] 投稿日:04/09/13 12:44:31 ID:nhse+q8c
ここで問題になるのは、作ったアプリが、
どれだけ多くのマシンで動いてくれるのか、だな。

コンソールレベルなら、Cの標準ライブラリで動くようになるけど、
Xを使うと独自のライブラリだからねぇ。

とりあえず、GTKに的を絞るべく、本を買ってはみたが・・・


482 名前:login:Penguin[] 投稿日:04/09/13 12:49:56 ID:N7RA+dWB
>>481
テンプレートベースならほとんどの環境で動く。
意外なことにサイズもそれほど大きくならない。
プログラムのサイズより大抵スタックのほうが大きいでしょ。
ヒープはもっともっと大きい。
気にしないでテンプレート使っちゃえばいいと思う。
Windowsもそうなってるし。
146デフォルトの名無しさん:04/09/14 08:53:48
deque の実装に配列の配列を使うと書いてある本があるんですが
実際どうなんでしょうね?ていうかどうやるんだろう…
147デフォルトの名無しさん:04/09/14 09:20:23
リングバッファを一つの配列じゃなくて、
複数の配列で実現してdequeにしてるんでしょ。
一つだとサイズを拡張しにくいから。

というか他にどうやってやるんだ…
148デフォルトの名無しさん:04/09/14 10:16:10
>>146
gccやSTLportのソース読めば?
149デフォルトの名無しさん:04/09/14 15:57:20
あの実装はソースを実際読んでもらうか,あるいは説明するなら絶対に図が必要だ・・・

>147
GCCのはリングバッファじゃないですよ.
前方にも未初期化なバッファを確保するvectorのイメージが近いです.

というか配列の配列を使ってるのって単に効率化のためだけで,
別にdequeの本質的な部分(前方に定数償却で挿入できる,など)には
全然関係ないような気がするんですけれど,どうなんでしょう?
150デフォルトの名無しさん:04/09/14 16:15:42
STLのコンテナって鼻毛が伸びるほど便利ですね。
151デフォルトの名無しさん:04/09/14 17:39:08
鼻毛のほうが便利だけどね。
152デフォルトの名無しさん:04/09/14 19:10:39
>151
どういう便利な使い道があるのか教えて
153デフォルトの名無しさん:04/09/14 19:28:50
>>152
あえて意識して使うまでもないだろ。
日頃からどれだけのたくさんの不純物を
シャットアウトしてくれてると思ってるんだ。
その時点でSTLより上。
154デフォルトの名無しさん:04/09/14 19:41:09
その通りだな
155デフォルトの名無しさん:04/09/15 11:36:03
random_shuffleで、RandomNumberGenerator指定しないとランダムにならないのは
仕様なのでしょうか?
あと、RandomNumberGeneratorは自分で作成しないといけないのでしょうか?
156デフォルトの名無しさん:04/09/15 17:32:14
>>155
「ランダムにならない」が、「プログラムを複数回起動しても
同一の並べ替えが起こる」を意味すると仮定して回答する。
random_shuffleは乱数生成器としてデフォルトでstd::randを使うから、
毎回違う結果がほしければ、random_shuffleを使う前に毎回違う値でstd::srandを呼ぶべし。
157デフォルトの名無しさん:04/09/15 20:51:37
/dev/randomから引っ張ってくればいいんじゃない?
158デフォルトの名無しさん:04/09/15 21:29:15
/dev/randomは重いじゃない?
159デフォルトの名無しさん:04/09/15 21:34:10
責任を他になすりつけられればそれでOK
160デフォルトの名無しさん:04/09/16 00:34:43
   ∩___∩         |
   | ノ\     ヽ        |
  /  ●゛  ● |        |
  | ∪  ( _●_) ミ       j
 彡、   |∪|   |     /devは重い
/     ∩ノ ⊃  ヽ  
(  \ / _ノ |  |
.\ “  /__|  |
  \ /___ /
161デフォルトの名無しさん:04/09/16 02:16:30
ギャップバッファが理解できません
162デフォルトの名無しさん:04/09/16 02:23:51
頭悪いですね
163デフォルトの名無しさん:04/09/16 17:48:27
>>155
大抵のOSの大抵の言語の大抵の処理系では、
srand 相当のものに同じ seed を渡すと(あるいは srand 相当のものを使わないと)
乱数を使うと毎回同じ数列が返されるようになってます。

乱数を利用するプログラムを作るとき、実行の度に違う値がでてると、
単体テストやらアルゴリズムの効率の比較やらプロファイリングに基づいた
チューニングとかしにくいから。
164デフォルトの名無しさん:04/09/16 21:32:35
rand使わずmt使え
165デフォルトの名無しさん:04/09/16 21:35:26
>>164
当然 mt でも事情は同じ。っていうかこれは利点なんだけど・・・
166デフォルトの名無しさん:04/09/17 09:56:04
> 乱数を利用するプログラムを作るとき、実行の度に違う値がでてると、
> 単体テストやらアルゴリズムの効率の比較やらプロファイリングに基づいた
> チューニングとかしにくいから。

あたかもそれを理由にそのような仕様にしたといわんばかり

しかし実際は疑似RNGから導かれる当然の結果に過ぎない

因果の誤解は思考力の不足を証明する
167not 163:04/09/17 10:31:49
>>166
API的は、seedを自動で、って選択もあったんじゃない?
# 例えば、大昔のMS-BASIC
渡すようにしてるのは、>>163にある理由もその一つでしょ。
168デフォルトの名無しさん:04/09/17 10:36:20
>>166
俺は163じゃないけど。
それを理由にそのような仕様にしたんだよ。srandの規格を嫁。

でもrandがグローバルだから使いにくいけどね。
169デフォルトの名無しさん:04/09/17 10:44:32
>>166
それを理由にそのような仕様にしたんだよ…
170デフォルトの名無しさん:04/09/17 11:09:51
171デフォルトの名無しさん:04/09/17 11:22:45
線形合同法の疑似乱数生成期に同じ種を与えれば同じ乱数列を吐き出すという現象は
「単体テストやらアルゴリズムの効率の比較やら
プロファイリングに基づいたチューニングをしやすいように」
という人間の要望から発生した?
人間の要望に応じて数学的現象が定まるのはおかしいな。
ピタゴラスの定理は誰かがそれを望んだからそうなったと言うタイプはどこにでもいるが。
172デフォルトの名無しさん:04/09/17 11:29:00
>>168
> それを理由にそのような仕様にしたんだよ。srandの規格を嫁。

163を翼嫁

「srand相当のもの」だ

疑似RNG全般についての話

疑似RNG全般の性格をその一部であるsrandの規格から規定するな
173デフォルトの名無しさん:04/09/17 11:30:48
>>171>>172

API設計の話をしていることが理解できない頭の人。
174デフォルトの名無しさん:04/09/17 11:37:24
>>172
スレ違いの上にウザイから下げて書けヴォケ
175デフォルトの名無しさん:04/09/17 11:39:20
>>171
こういう、知識は豊富だけど頭が悪い人、っているよね。
176デフォルトの名無しさん:04/09/17 12:31:47
アルゴリズムの話からAPI設計の話にすりかわった?
177デフォルトの名無しさん:04/09/17 12:42:16
>>176
はじめからAPIの話だと思ってました。
178デフォルトの名無しさん:04/09/17 12:43:33
>>166
MS BASIC はかなり初期のものから RANDOMIZE で seed を与え(られ)る仕様だよ。
実行毎に自動的に seed の初期化はされないけど、それは変数の値も含めて
全ての環境が残るっていう BASIC インタプリタの特性をひきずってるから。
179デフォルトの名無しさん:04/09/17 12:47:13
>>171
処理系(ライブラリ)が勝手に seed を変えたりはしない、というAPI の仕様の話をしてます。
だって発端が >>151 だし。んで一般アプリケーションはどう振舞うべきかというと>>156
回答が出ているわけで、なんとも終わった話であることであるなぁ・・・
180デフォルトの名無しさん:04/09/17 12:48:35
発端が>>151って・・・(w
>>155 じゃねーの?
181デフォルトの名無しさん:04/09/17 15:54:51
>>177
アルゴリズムの話からAPI設計の話にすりかえて
そのあとAPI設計の話からAPIの話にすりかえた?
182デフォルトの名無しさん:04/09/17 15:56:33
>>181
アルゴリズムって、STL用語で言うところのアルゴリズムのこと?
183182:04/09/17 15:57:45
ごめん。ageちゃった……。100回種付けしながら反省してきます。
184デフォルトの名無しさん:04/09/17 16:05:22
ていうか >>163

> 大抵のOSの大抵の言語の大抵の処理系では、
> srand 相当のものに同じ seed を渡すと(あるいは srand 相当のものを使わないと)
> 乱数を使うと毎回同じ数列が返されるようになってます。

この前半部分は「大抵のOSの大抵の言語の大抵の処理系」と言ってるように
特定の言語の特定の規格について言ってるわけではなく
一般的に使われている線形合同な疑似乱数アルゴリズムの特徴について解説してる。

> 乱数を利用するプログラムを作るとき、実行の度に違う値がでてると、
> 単体テストやらアルゴリズムの効率の比較やらプロファイリングに基づいた
> チューニングとかしにくいから。

この後半は一見前半を受けて前半部分の理由を書いてるように見えるがそうではなく
Cの規格に含まれるrand/srandがなぜ線形合同な疑似乱数を採用したかの理由となってる。

話の展開がちぐはぐ過ぎだ。
これじゃ疑似乱数アルゴリズム全般の話題だと解釈する人も出てくるし
Cのrand/srandに特化した話題だと解釈する人も出てくる。

163の話の真中でアルゴリズムの話から規格の話に脈略なくすりかわってるということ。
185デフォルトの名無しさん:04/09/17 16:13:37
(1)特定のアルゴリズムを使うとなぜそのような結果になるのかという理由
(2)特定の言語の規格がなぜそのアルゴリズムを採用したかという理由

>>155からアルゴリズムの話になってる最中に
(1)のふりをして(2)を書いたから人によって話題の対象がばらばらになり
アホレスが連鎖したってことかな
186デフォルトの名無しさん:04/09/17 16:17:34
>>182
モリフォーリズムのこと
187デフォルトの名無しさん:04/09/17 16:19:36
モリフォーリズムに該当するページが見つかりませんでした。
188デフォルトの名無しさん:04/09/17 16:24:17
正しくはポリフォーリズムだそうです
http://pc5.2ch.net/test/read.cgi/tech/1071697977/388-
189デフォルトの名無しさん:04/09/17 16:27:35
流行だったのか。Javaスレでも書いてあった。
190デフォルトの名無しさん:04/09/17 18:15:13
モリモリタベヤサーイ
191デフォルトの名無しさん:04/09/17 18:48:25
163=167=168=169
まずこのポリホの日本語をなんとかしてくれ
192デフォルトの名無しさん:04/09/17 20:47:05
>>185
漏れは 163 なんだけど、
>>155 を「なんで適当に seed を毎回変えてくれないの?バグ?仕様?」ってな風に読んじゃったわけ。
seed が同じ擬似乱数なら毎回同じ系列が出てくるのは自明だとおもったんで。
んで、なんで毎回適当に変える仕様になってないか、を説明してしまった。

変わらないことが必要なことはあるし、変えたいなら自分で変えられるし、と。
193デフォルトの名無しさん:04/09/17 20:48:44
えーと、163=178=179=192です。
194デフォルトの名無しさん:04/09/17 21:29:28
俺は163じゃないんだけど
とやかく言う前にsrandの規格書を読め
195is not a 163:04/09/17 21:42:21
srandの規格を読んだことない厨が知ったかぶりしてるだけでしょう。
頭悪いのバレバレ。
196デフォルトの名無しさん:04/09/17 21:49:00
結局、>>166は何をどう誤解したの?
197163以外の人:04/09/17 21:52:53
>>166
乱数の仕組みの話題だと勘違いしているようですが、
最初からAPIの話題です
198デフォルトの名無しさん:04/09/17 21:53:05
>>163の前半は採用されてるアルゴリズムはこうですよ、という説明、
後半はなぜ採用されたのか、という説明。
なのに、>>166は後半をアルゴリズムがそうである説明だと誤解したわけだね。
なぜそんなありえない誤解の仕方をしたのかは解からないけど、
酔っ払っていたのかもしれないし、頭のおかしい人が沢山いる環境で生活してるのかもしれない。
あんまり攻めてやるな。
199デフォルトの名無しさん:04/09/17 21:57:21
163ではありませんが、
163はアルゴリズムの話ではなくて、発端からAPIの話題のつもりです
200デフォルトの名無しさん:04/09/17 22:01:26
>>166も仕様の話じゃん。
擬似RND以外に選択肢が無かったみたいなことを言いたかったんじゃないの?
201デフォルトの名無しさん:04/09/17 22:03:13
163の前半はC言語の規格が採用したアルゴリズムを説明。
後半は採用した理由。
だから163は間違ってないということでファイナルアンサー?
202デフォルトの名無しさん:04/09/17 22:04:59
>>201
それはみんな理解してる。
話題はすでに>>166が何を意味してるのかに移ってる。
203デフォルトの名無しさん:04/09/17 22:20:26
APIって言葉がたくさん出てきてるけど
ここではどういう意味で使ってるんですか?
みんなばらばらのように見えるんですが
204デフォルトの名無しさん:04/09/17 22:21:20
APIはAPIだべ
205デフォルトの名無しさん:04/09/17 22:25:27
APIとはsrandの規格のことかな?
206デフォルトの名無しさん:04/09/17 22:28:59
そもそもseedを必要としないほうがいいなら、API内部でseed作るっつーの。
207デフォルトの名無しさん:04/09/17 22:29:35
templateを利用することによってDIPが
よりよく実現されると言えるかな?
208デフォルトの名無しさん:04/09/17 22:32:56
API を外部に持たせてるのは seed 設定できる理由のためですよ。
複雑になるだけでそれ以外メリットないし。
209デフォルトの名無しさん:04/09/17 22:39:26
163じゃないが
163を分かりやすく言い直すと次のようなもの

・ほとんどの言語や処理系では乱数に疑似乱数を使っている
・疑似乱数の場合 srand のような seed 設定できる関数に seed を渡すと毎回同じ数列が返る
・さらに srand のような seed 設定できる関数を使わない場合も毎回同じ数列が返る
・なぜそういう結果になるかというと、実行の度に違う値がでてると不便だから
・不便というのがどういうことかというと
単体テスト・アルゴリズムの効率の比較など
プロファイリングに基づいたチューニングとかしにくい
210デフォルトの名無しさん:04/09/17 22:52:01
>>171
・・・という現象は・・・という人間の要望から発生した?
と書いてあるからこいつが誤読してる。
現象が発生したのではなく、仕様が発生したとみんな言ってるだけなのに。
211デフォルトの名無しさん:04/09/17 22:58:43
>>207 のDIPって設計原則のDIPのこと?
DipendencyなんたらPrinciple?
212デフォルトの名無しさん:04/09/17 23:09:09
STLのイテレータはDIP的に考えると、すべてランダムアクセスであるべきだと思う。
213デフォルトの名無しさん:04/09/17 23:19:14
214デフォルトの名無しさん:04/09/17 23:25:54
DipendencyじゃなくDependencyだったよ orz

DIPはせまく読めば古典的なOOデザインだが、Policyなんか
先に生まれたライブラリがあとから提供されるものに依存する、
という点では立派な依存関係の逆転。
215デフォルトの名無しさん:04/09/18 13:24:30
「163じゃないけど」と名乗る人が
短時間に似たようなことを沢山書くのが流行デスカ
216デフォルトの名無しさん:04/09/18 15:14:24
216じゃないけど
そうみたいです。
217デフォルトの名無しさん:04/09/18 17:36:40
>先に生まれたライブラリがあとから提供されるものに依存する
>先に生まれたライブラリがあとから提供されるものに依存する
>先に生まれたライブラリがあとから提供されるものに依存する

んなことできるかボケ
218デフォルトの名無しさん:04/09/18 17:58:20
依存という言葉を聞きかじった厨房が
知ったかぶりに使ってるだけなんだから
許して上げてください
219デフォルトの名無しさん:04/09/18 18:07:06
163やあれへんのが、きょうびのステータスや、われ
220デフォルトの名無しさん:04/09/18 18:15:24
ライブラリが何らかの引数をとれば、一応そのライブラリは
後から渡されたパラメータに依存していることになる。
その引数が単なる値じゃなくてポリモっぽいものであれば
アルゴリズムその他は後から提供されたものに委ねるという
パターンがとれる。
じゃあテンプレートパラメータの場合は?

通常(メソッドや関数)の引数としてに何かを受け取る場合
と違い、アルゴリズムだけじゃなく自分自身の構造まで依存
できる。
ポリシーの多重継承で実装されたホスト・クラスなんかはそう。
221デフォルトの名無しさん:04/09/18 18:28:44
>ポリモっぽいものであれば

インターフェイスに依存している

>テンプレートパラメータの場合は

同じ
222デフォルトの名無しさん:04/09/18 19:01:14
依存関係を逆転、ってのは何らかの決定を遅延させる
ことによって再利用性を高めるのが目的。
インターフェイス、データ構造、アルゴリズムのうち
どれかは最初に規定しておくが、その他は後から提供
できるようにしたい。
普通のOOの場合はインターフェイスが規定されていて
アルゴリズムは後付けOK。
テンプレートの場合は?同じじゃないよね?
223デフォルトの名無しさん:04/09/18 22:38:46
>>222
日本語でヨロ
224デフォルトの名無しさん:04/09/18 23:12:22
>>222
テンプレートは同じインターフェイスのものをまとめるものだから、
インターフェイス重視という点ではすごくDIP。
225デフォルトの名無しさん:04/09/19 09:34:59
特定のインターフェイスを継承しなけりゃならないのはうざ。
ホストクラスが使う限りのメソッドを、コンパイルが通るシンタックスで
用意しておけばOKとなれば、そこで(ベースとなるインターフェイスとの)
依存関係が切れてウマー
226デフォルトの名無しさん:04/09/19 13:15:07
インターフェイス(クラス)との依存は切れるけど
使ったメソッドなどのインターフェイスとの依存を切る事は出来ないよ。
227デフォルトの名無しさん:04/09/19 15:12:36
そりゃそうだ。つーか当然

>>222で書いたインターフェイス、データ構造、アルゴリズムなどの
要素について、どれに対する依存を残してどの依存を切るかtemplateを
使うと選択肢が増えると言いたかった。
228デフォルトの名無しさん:04/09/19 19:35:14
222は依存という言葉を間違えて使ってるとしか思えない

他にも日本語おかしいが
229デフォルトの名無しさん:04/09/19 20:53:53
最近Boostを使い始めたんですが、Boostの知名度というか認知度というかそういうのはどうなんでしょうか?

例えば配列の代わりにvectorを使用してて怒られるといったことは(特殊な環境を除いて)ないだろうと思いますが
ポインタの代わりにshared_ptrを使うというのはあまり推奨されないものなんですかね?

230デフォルトの名無しさん:04/09/19 20:58:49
>>229
知らないやつが勉強不足。
231デフォルトの名無しさん:04/09/19 20:59:31
>>229
auto_ptrで済む所をなんでもshared_ptrにするのはどうかと思いますね
232デフォルトの名無しさん:04/09/19 21:21:22
>>230-231
どうもありがとうございます。

>知らないやつが勉強不足。
うちの教授(プログラムの専門に非ず)に「標準じゃないけど使って大丈夫なん?」的な
ことを言われたんでちょっと使うのが不安だったんですが、使っても良さそうですね。

>auto_ptrで済む所をなんでもshared_ptrにするのは
そこら辺も注意してやっていきたいと思います。

それにしてもまだあまり参考書が出版されてないみたいですね。
やはりSTLへの採用待ちですか…
233デフォルトの名無しさん:04/09/19 21:24:22
>>232
教授は単に君の勉強不足を不安視したんでは。
使っても大丈夫かどうか2chで聞くくらいだから。
234デフォルトの名無しさん:04/09/19 21:32:29
>>222はStrategyとかのことをいってるんちゃう?
>>232
STLへの採用ってあるのかな?
BoostはBoostとしていつか標準化されるんだと思ってたけど
235デフォルトの名無しさん:04/09/19 21:38:00
>234
STL(というか、C++標準ライブラリ)への採用は結構マジ話らしい。
聞きかじりだけど、boost::iteratorsあたりで使われているイテレータの分類なんかは
もう次期C++への採用は内定だそうで。
236デフォルトの名無しさん:04/09/19 21:44:21
function, tuple, type_traits, regex, mem_fn, shared_ptr, ref, bind は
次期C++標準に含まれることが決定しているそうな
237デフォルトの名無しさん:04/09/19 21:47:07
次期ってまだこのポンコツ言語を引っ張るつもりなのか・・・
238デフォルトの名無しさん:04/09/19 21:57:50
function や bind を標準装備しないまま引っ張る方がよほど困るわ
239デフォルトの名無しさん:04/09/20 00:11:56
>>232
boostはSTLと同じくらい標準だよ。
それぐらいSTLは使われてない。
実装がひとつしかない分、boostのほうがまともかもしれない。
240デフォルトの名無しさん:04/09/20 00:18:57
>>239
>boostはSTLと同じくらい標準だよ。
>それぐらいSTLは使われてない。

意味不明すぎ。STLは標準でboostは標準じゃない。
241デフォルトの名無しさん:04/09/20 00:20:59
>boostはSTLと同じくらい標準だよ。
>それぐらいSTLは使われてない。

分かりやすく
242デフォルトの名無しさん:04/09/20 00:25:49
ある意味笑うところかも
243デフォルトの名無しさん:04/09/20 00:39:20
マジどころかそれを目的にやってきたのに
「結構マジ話らしい」言われちゅゃおうところが情けな
244デフォルトの名無しさん:04/09/20 00:40:09
あげるな
245デフォルトの名無しさん:04/09/20 01:14:43
hash_mapはboostより標準ですか?
246デフォルトの名無しさん:04/09/20 01:17:03
ちゃいます
247デフォルトの名無しさん:04/09/20 01:22:33
>実装がひとつしかない分、boostのほうがまともかもしれない。
これは的を射てますね
つ~かboostの中の人はSTLに依存しないコードを書いちゃってくれたらいいのに
と思いますよ
sgiと組み合わせるとボロボロ
結局preprocessorしか使えない
lexical_castすら使えないのには泣けました
248デフォルトの名無しさん:04/09/20 01:24:37
stlport使ってくだはい
249247:04/09/20 01:56:45
stlportということでちょっとついでに込み入ったこと聞きたいんですけどいいですかね
とあるハードウェア用のAPIを使って書かないといけないんです
でそのSDKが既にsgi使ってるんですよ
#includeが<list>だったり<list.h>だったりして

そのライブラリのソースコードは提供されていません
SDKにはAPIのヘッダ達とユーザ側でリンクするオブジェクトファイル(.lib)と
sgistlのヘッダが含まれているんです

例えばVC++付属のstl使おうとするとコンパイルとおらないんですが
こういう状況でstlport使えるんでしょうか?
ていうか試して使えなかった記憶があるんだけどもし使える方法があるならかなり嬉しい
250デフォルトの名無しさん:04/09/20 02:18:04
>>249
バイナリ提供部分とのインターフェースがsgistlに依存していれば無理。
そうでなければ、どうにかして置き換えられるはず。

もちろん、「どうにかして」の部分は実際に
その環境を持っているあんたにしかわかんないよ。
251あんた:04/09/20 02:29:01
>>250 どうもありがとうございます
>バイナリ提供部分とのインターフェースがsgistlに依存していれば無理。
これってどうやったらわかるんですか?
というライブラリがsgiとスタティックリンクされてたら無理
っていう理解でよいでしょうか?
252デフォルトの名無しさん:04/09/20 02:48:29
>>249
そのSDKはSGIのSTLのままでいいの?

stlportの名前空間を変えてリンクすれば?
253あんた:04/09/20 02:57:33
>>252 はい
別にSDKがSGI使ってるのはかまわないです
>stlportの名前空間を変えてリンクすれば?
namespace stlport{
#include <stlport/list>
}
using namespace stlport::std;

とかで,stlportにもリンクすればいけますかね
これは試してない
いけたらすご~く嬉しい
254あんた:04/09/20 03:02:18
重複スイマセン
↑の場合例えばboost側でstl使ってるところで
「sgiとstlportどっち使えばいいんだよ~」って言われちゃいません?
SDKのヘッダインクルードする前にboostインクルードすればいいのかな
むぅまぁ明日試してみます
255デフォルトの名無しさん:04/09/20 03:19:50
>>249
ふつうにSTLport使おうとするとどうなるのかを言ってもらわないと、お話にならないね。
256デフォルトの名無しさん:04/09/20 17:44:14
Modern本の『1.3多重継承で解決できるのか?』
の3番目にある状態の操作というところがわかりません。最初にある、
「基底クラスを用いて実装される様々な動作は、同じ状態を操作しなければ
なりません」のとこからいきなり意味不明。
257デフォルトの名無しさん:04/09/20 22:03:03
1や2は理解できてんのか?
258デフォルトの名無しさん:04/09/21 00:25:35
>257
まあ、まあ

>256
状態とは、大雑把に言うとデータのことだよ。

まずは多重継承、仮想継承から始めなされ
ググッてみたら、ここがよさげだった。
ttp://www.uri.sakura.ne.jp/~cosmic/yuno/lab/cpp_virtualbase.html
ttp://www.tietew.jp/cppll/archive/1167

259デフォルトの名無しさん:04/09/21 20:12:31
>>253
STLportはオプションで_STDかなんかそんな名前空間に切り替え
られるはず。
で、それでboostコンパイルが…できるかどうかは、今C++の環境が
すぐに出せないから答えられん。。。boostオプション見てみて。
260256:04/09/21 22:52:10
>>258 ありがとう
多重継承や仮想継承については大体知ってるんだけど、あの内容と
どうつながるのかわからないっす
飲みすぎでレス遅くなりスマソ

>>257 わーてるよ\(`Д´)ノ
261256:04/09/21 23:06:25
>>260
あの本の中じゃテンプレートを使用しないとどんなことになるのか
例示されてないからイメージ沸きヅラいかも
262256:04/09/21 23:53:38
>>261
あぁ。そうだな。
飲みすぎには注意しろよ。
263デフォルトの名無しさん:04/09/22 16:01:48
(・∀・)ジサクジエンデシタ
264デフォルトの名無しさん:04/09/23 00:13:53
一ひねりしろ
265デフォルトの名無しさん:04/09/23 07:58:17
>>256 『状態が保持されている基底クラスを継承するには』という条件が付いて
ますよね?必ずそうしなければいけない訳ではないので仮想継承うんぬんはあまり
気にしなくていいのではないかと。
むしろ『ユーザ・クラスはライブラリ・クラスを継承するものの、その逆は許されない』
という注意点と、前のページの下のほうにある『設計とは、制約を課す作業のことです』
以下の文章をよく読み比べてみて下さい。
266デフォルトの名無しさん:04/09/26 16:40:24
このスレを通り過ぎて来たらstlportさんの話がちらほら聞こえてきた。
あぁ、stlportさんをまだ君を大事にしてくださる方々がいるのですね。
僕は、今でもあの時、君と出会った感動を忘れないよ。
今では、僕が君とは交じり合うことは無くなってしまったけど。
どうか、stlportさんとお付き合いを重ねている方々・・・。・
末永く僕の分まで一緒にいてあげてください。
267デフォルトの名無しさん:04/09/26 16:41:45
    ._,,,,,,,,,,,,,,,,,,,、     _      ___         ,,,,,,,、
    l___ l'     / / __,,   ヽ'~~}       _l ,l__
  __,¬ / >_    / ∠. ||  ll   l. l      .゙    ___}
  ー-l ,==| |==,゙〆  ノノ .==. ||  ||   l 「       ゙゙゙゙| ,i  _
    ,l l!==| |==,!\  ゙~! | ̄ ||  ||   l l     ,,,.   / l゙ ←丶
   ,,l゙, l.==| |==,,ヽ ゝ  / ヽ .||  ||   .l l,、 ,,,,,/゙ l  / l゙ 、
  :l-゙゙  ,,,, l゜l       / lヽノ ll, ,||   ゙l,, ゙゙゙゙゙゙  .l゙  ノ. ,l゜ ゙l――ヽ,
     .゙゙--゙      ~    ゙゙゙°     ゙゙゙゙゙゙゙゙゙゙″  ゙゙゙゜   ゙゚゙゙゙゙゙゙゙゛
268デフォルトの名無しさん:04/09/26 18:10:15
_| ̄|.............○))
269デフォルトの名無しさん:04/09/26 22:25:07
>>158
seed だけ /dev/random から持ってくれば良いじゃん。
270デフォルトの名無しさん:04/09/26 22:53:42
>>269
そんなことするならいっそurandomで
271デフォルトの名無しさん:04/09/27 16:45:30
>>534
作らない。
http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/qid=1096270912/sr=1-1/ref=sr_1_18_1/249-7749404-9276354
この本読めばわかる。読まなくてもいいけど。
要するに自分がこのクラスとこのクラス(あるいは関数)は深く関連があるなと思えば一緒のヘッダで宣言するだけの話。
272271:04/09/27 16:47:39
恥ずかしい
http://pc5.2ch.net/test/read.cgi/tech/1094494997/
ここに貼るつもりがここでやっちゃった。
273デフォルトの名無しさん:04/09/27 23:47:39
すいません、素人質問なんですが。

STLport 4.6.2(iostreamビルド済み) + boost 1.31.0の組み合わせで
bjam -sTOOLS=msvc-stlport "-sBUILD=debug release <runtime-link>static/dynamic" stage

でビルドし、<boost/filesystem/path.hpp>を使うと、リンク時に
libboost-filesystem-vc6-mt-sgdp-1_31.libが無いと怒られます。


boost/config/auto_link.hppを見ると_STLP_OWN_IOSTREAMS指定時は-sgdpが
付くのが正しいようですが、普通にbjamでビルドするとどうしても-sgdpタイプのライブラリが
生成されません。bjamのオプションで何か足りないのでしょうか?
"Getting Started"を見てもそれらしい指定が見あたらないのですが。


STLportを使わなければリンクできるのですが、将来VC7移行時にstlのバージョン間の
違いに悩まされたくないので、できれば使いたいのです。

環境はXP Pro(SP1) + VC6(SP5)です。どなたか教えて下さい。
274デフォルトの名無しさん:04/09/28 02:09:47
>273
俺も今stage/lib見たらmt-sgdpがなかった。
ちょいと調べてみるけど、VC6の環境ないんで判るか微妙。

今回の問題には多分関係ないけど、
VC6+STLportならbjamのスイッチstlport-iostreamをonに設定しないとだめ。
あと、STLPORT_PATH周りの設定もきちんとしているか確認。
tools/build/v1/msvc-stlport-tools.html のオプションをしっかり確認する事。

あと、そのあたりの問題について参考になるか分からないけど、
cppllで最近出たVC6でのboostのビルドについての話題。
ttp://www.tietew.jp/cppll_novice/archive/472
275274:04/09/28 02:45:43
mt-sgdp出た。vc7.1だけど。
>bjam -sTOOLS=vc7.1-stlport "-sBUILD=<native-wchar_t>on <runtime-link>static/dynamic <threading>multi" stage

vc6+stlportで実際にビルドするなら、こんな感じかな?
試してないから保証はできないけど。
>"c:\program files\microsoft visual studio\vc98\bin\vcvars32.bat"
>set STLPORT_PATH=(STLPortのルートフォルダの一つ上へのパス)
>set STLPORT_VERSION=(STLPortのバージョン)
>bjam -sTOOLS=msvc-stlport "-sBUILD=debug/release <stlport-iostream>on <runtime-link>static/dynamic <threading>single/multi" stage
276273:04/09/28 09:33:34
>>274,275
ありがとうございます。ちょっとこれから出先なので、今日中に試して報告します。
277273:04/09/28 23:36:15
駄目でした・・・

STLPORT_PATH, STLPORT_4.6.2_PATH, STLPORT_VERSIONを
定義して
bjam -sTOOLS=msvc-stlport "-sBUILD=release debug <threading>single/multi
<runtime-link>static/dynamic <stlport-iostream>on <native-wchar_t>on" stage

でビルドしてみたら、期待通りmt-sgdpができました。

が、Let's Boostの
http://www.kmonos.net/alang/boost/classes/filesystem.html
を適当なプロジェクトのcppに入れてビルドすると

fs.obj : error LNK2001: 外部シンボル ""public: class _STL::basic_string<char,class
_STL::char_traits<char>,class _STL::allocator<char> > __thiscall boost::filesystem::path::
leaf(void)const " (?leaf@path@filesystem@boost@@QBE?AV?$basic_string@DV?
$char_traits@D@_STL@@V?$allocator@D@2@@_STL@@XZ)" は未解決です
Debug/fs.exe : fatal error LNK1120: 外部参照 1 が未解決です。

とエラーが出ます。もう何が何やら…

もう数日試してみて、駄目なら諦めます。成功したら書き込みますので、
消えたら駄目だったと思ってください。
278274:04/09/29 09:42:08
>277
多分、STLPORT_*の設定がうまく行っていないせいだと思う。
そのせいで、STLportを使わずにVC6のSTLを使っちゃってるんじゃないかな。
生成されたDLLファイルを覗いてみて、エクスポート関数の返り値や引数の型に
std::ってついていたら確実にそのミスなんだけど、確認の方法を知っていたら確認してみてくり。

具体的に、環境変数STLPORT_*を何に定義したのか晒してほしい。

>274 のcppllの記事の中で出てたこのURL読んだ?
ttp://hw001.gate01.com/eggplant/tcf/cpp/boost_build.html
279273:04/09/29 11:34:26
>>274
記事は読んでいました。
Dependency Walker(あるいはdumbpin /import)で覗くとMSCVP60D.DLLに依存してました。


STLPORT_4.6.2_PATHがC:\cpp\lib\STLport-4.6.2\stlportになっていたのを修正して、

STLPORT_4.6.2_PATH=C:\cpp\lib\STLport-4.6.2
STLPORT_PATH=c:\cpp\lib
STLPORT_VERSION=4.6.2

で再度ビルドしてみましたが、こんどは
C:\cpp\lib\STLport-4.6.2\stlport\cstdio(117) : error C2039: 'vsnprintf' : '`glob
al namespace'' のメンバではありません。
C:\cpp\lib\STLport-4.6.2\stlport\cstdio(117) : error C2873: 'vsnprintf' : シンボル
を using 宣言の中で使用することはできません。
C:\cpp\lib\boost_1_31_0\boost/detail/allocator.hpp(277) : fatal error C1506: ブロ
ックが大きすぎて、コンパイルできません。

とエラーが出るようになりました。

とりあえず、午前中はこんな感じです。
280デフォルトの名無しさん:04/09/29 18:53:58
MLの同じツリーに、
>ただこれで bjam を実行するとコンパイルエラーが出てしまい、
>STLport の cstdio の 117行目を
>using _STLP_VENDOR_CSTD::vsnprintf;
>から
>using _STLP_VENDOR_CSTD::_vsnprintf;
>に修正することでエラーが出なくなりました。

とある。試してみたら?
281デフォルトの名無しさん:04/09/29 21:47:25
#define BOOST_REGEX_MATCH_EXTRA
定義しないとboost::smatch::captures使えなかったのかよ...orz
できれば名前付きキャプチャもサポートしてホスィ
282273:04/09/30 11:17:03
>>280 できました!ありがとうございます。
全部読んでいたはずなのに、いざとなると頭からすっぽり抜けていました。


まとめると
1.stlport/stl_user_config.hには手を付けない(_STLP_NO_OWN_IOSTREAMSはコメントアウトしたまま)
stlport/cstdio の117行目を「using _STLP_VENDOR_CSTD::_vsnprintf;」に修正(アンダースコア追加)
2.nmake -f vc6.mak clean all; nmake -f vc6.mak installでSTLport 4.6.2をビルド&インストール
3.VCVARS32.batのset INCLUDEとset LIBにSTLportを追加。
あと、環境変数か上記バッチに
set STLPORT_4.6.2_PATH=C:\cpp\lib\STLport-4.6.2 (インストール先)
set STLPORT_PATH=c:\cpp\lib (インストール先の1つ上)
set STLPORT_VERSION=4.6.2 (バージョン文字列)
も追加する。必要に応じてVC++6のディレクトリ設定も追加。
4.bjamでビルド。
C:\cpp\lib\boost_1_31_0>bjam -sTOOLS=msvc-stlport "-sBUILD=release debug
<threading>single/multi <runtime-link>static/dynamic <stlport-iostream>on
<native-wchar_t>on" stage
スレッドやランタイム、ワイド文字サポートは不要なら削除。


参考サイト
ttp://www.tietew.jp/cppll_novice/archive/472
ttp://hw001.gate01.com/eggplant/tcf/cpp/boost_build.html
ttp://ciel.hio.jp/translation/STLport/INSTALL.ja.html

>>274様、>>280様、ありがとうございました。
283281:04/09/30 18:39:09
なんかcapturesがへんな結果返すんだが、バグ?

#define BOOST_REGEX_MATCH_EXTRA
#include<boost/regex.hpp>
void print_recursive_captures(const std::string& regx, string next)
{
boost::regex e(regx);boost::smatch match;
while(boost::regex_search(next, match, e, boost::match_extra))
{
for(unsigned int i = 0; i < match.size(); ++i)
std::cout << " $" << i << " = \"" << match[i] << "\"\n";
for(unsigned int i = 0; i < match.size(); ++i){
std::cout << " $" << i << " = {";
for(unsigned int j = 0; j < match.captures(i).size(); ++j){
std::cout << "\"" << match.captures(i)[j] << "\"";
( j+1 < match.captures(i).size()) ? (std::cout <<",") : (std::cout << "");
}
std::cout << " }\n";
}
next = match.suffix();
std::cout << "next=" << next << std::endl;
}
}
int main(){
print_recursive_captures("([A-Z_]+?)\\(([^,\\)]+?)(?:,([^,\\)]+?))*?\\)",
"__ABC__(CPP,CS)11111111111111111__CDE__(cpp,cs)22222222222222222");
}

284283の修正:04/09/30 18:43:55
string next -> std::string //引数の修正
#include<iostream> //追加
結果:
$0 = "__ABC__(CPP,CS)"
$1 = "__ABC__"
$2 = "CPP"
$3 = "CS"
$0 = {"__ABC__(CPP,CS)" }
$1 = {"__ABC__" }
$2 = {"CPP" }
$3 = {"CS" }
next=11111111111111111__CDE__(cpp,cs)22222222222222222
$0 = "__CDE__(cpp,cs)"
$1 = "__CDE__"
$2 = "cpp"
$3 = "cs"
$0 = {"__CDE__(cpp,cs)","111111111111111" }
$1 = {"__CDE__","1111111" }
$2 = {"cpp","111" }
$3 = {"cs","11" }
next=22222222222222222
285デフォルトの名無しさん:04/09/30 21:34:21
char str[][10] = {"abc", "def", "ghi", "jkl"};

みたいな二次元配列があって、これをstd::sort()アルゴリズムに渡すには
どうしたらいいのでしょうか?

std::sort(str, str + 4, std::strcmp); とやってもエラーが出ます。

C:/STLport-4.6.2/stlport/stl/_algo.c:750: error: ISO C++ forbids assignment of arrays

C:/STLport-4.6.2/stlport/stl/_algo.c:754: error: incompatible types in assignment of `char*' to `char[10]'

というよな感じで。本当はもっとずらずらとエラーが出るのですが、STLのエラーは
そのまま貼っても無駄に長いだけですよね。

環境はgcc3.4.2(MinGW) + STLPort 4.6.2です。
286デフォルトの名無しさん:04/09/30 21:52:45
std::ptr_fun(std::strcmp)
287デフォルトの名無しさん:04/09/30 22:09:35
>>286
レスありがとうございます。やってみましたがダメみたいです・・・・
同じようなエラーが出ました。
288デフォルトの名無しさん:04/09/30 22:19:25
>>285
それだと、ソートアルゴリズム中で

  // x, y 番目を入れ替え
  tmp = str[x];
  str[x] = str[y];
  str[y] = tmp;

なんつーコードに展開されるからダメでしょ。

char const* str[] = { "abc", "def", "ghi", "jkl" };

とか std::string の配列にすれば OK だと思うが、どうよ?
289デフォルトの名無しさん:04/09/30 22:52:18
>>288
やっぱりそうなんですか。std::sortには比較関数しか渡せませんからねえ・・・・
std::sortに交換関数も渡せればいいのですが。
でも、教えて頂いたように書き換えてうまく行きました。ありがとうございました。
290デフォルトの名無しさん:04/09/30 23:01:40
>>285
上はようわからんが、下のはソート対象のiteratorの参照先がchar[10]
に対してstrcmpに渡す値がchar*なので型変換できないのではないかと。

あと比較ファンクタはstd::less相当のものでないとソートできないと思い

入力変数  std::less  strcmp
  a,b     true    true
  a,a     false   false
  b,a     false    true


>>288
配列コピーはサポートされているのでは?


なんか久しぶりにSTL見たのでうまく表現できん。。。
291デフォルトの名無しさん:04/09/30 23:09:21
>>290
あーそっか。std::strcmpではまずいですね。どおりで結果が変だと
思いました。そしたら叙述関数か関数オブジェクトを外部に作ります。

配列のコピーはどうやったらできるんでしょうか?std::sortには渡せ
ないんですが・・・風呂入って来ます。
292デフォルトの名無しさん:04/09/30 23:14:43
>>291
一年近くSTLさわってないんではずしてたらすまんが
コピー可能なイテレータ作ればいいんじゃねぇの?

配列のコピーがサポートされてたかどうかは忘れたけど、
それくらいテンプレート関数使えば簡単に出来るんだからサポートしろって感じだけどな。
293デフォルトの名無しさん:04/09/30 23:15:27
以来彼の姿を見たものはいない・・・
294デフォルトの名無しさん:04/09/30 23:41:27
>>292
イテレータの自作ですか。代入演算子やコピーコンストラクタを配列に対して
定義するしかないんですね。ちと残念ですがまだそこまで私の実力が伴わない
ので諦めます・・・・

しかし qsort() に出来て std::sort() だと簡単にはできないというのが悔しい・・・
295デフォルトの名無しさん:04/10/01 01:03:37
VC7.1 では動いてるように見える

#include <iostream>
#include <algorithm>
#include <iterator>
template< typename T, size_t size > class array_iterator_t
{
public:
array_iterator_t( T (*ptr)[size] ) : m_ptr( ptr ){}
array_iterator_t( array_iterator_t const& src ) : m_ptr( src.m_ptr ){}
array_iterator_t & operator =( array_iterator_t const& src ){ m_ptr = src.m_ptr; return *this; }
array_iterator_t & operator ++(){ ++m_ptr; return *this; }
array_iterator_t operator ++(int){ return array_iterator_t( m_ptr++ ); }
array_iterator_t & operator --(){ --m_ptr; return *this; }
array_iterator_t operator --(int){ return array_iterator_t( m_ptr-- ); }
array_iterator_t & operator +=(ptrdiff_t d){ m_ptr += d; return *this; }
array_iterator_t & operator -=(ptrdiff_t d){ m_ptr -= d; return *this;}
array_iterator_t operator + (ptrdiff_t d) const{ return array_iterator_t( m_ptr + d ); }
array_iterator_t operator - (ptrdiff_t d) const{ return array_iterator_t( m_ptr - d ); }
ptrdiff_t operator - (array_iterator_t const& base) const{ return m_ptr - base.m_ptr; }
bool operator==( array_iterator_t const& rhs ){ return m_ptr==rhs.m_ptr; }
bool operator!=( array_iterator_t const& rhs ){ return m_ptr!=rhs.m_ptr; }
bool operator<=( array_iterator_t const& rhs ){ return m_ptr<=rhs.m_ptr; }
bool operator<( array_iterator_t const& rhs ){ return m_ptr<rhs.m_ptr; }
bool operator>=( array_iterator_t const& rhs ){ return m_ptr>=rhs.m_ptr; }
bool operator>( array_iterator_t const& rhs ){ return m_ptr>rhs.m_ptr; }
296デフォルトの名無しさん:04/10/01 01:04:08
// 続き
struct array {
T value[size];
operator T*(){ return value; }
};
array& operator*(){ return *reinterpret_cast< array* >( m_ptr ); }
typedef std::random_access_iterator_tag iterator_category;
typedef array value_type;
typedef ptrdiff_t difference_type;
typedef array* pointer;
typedef array& reference;
private:
T (*m_ptr)[size];
};
template< typename T, size_t size > array_iterator_t< T, size > array_iterator( T (*ptr)[size] ){ return array_iterator_t< T, size >( ptr ); }
bool string_less( char const* a, char const*b ){ return strcmp( a, b )<0;}
int main(int argc, char* argv[])
{
char str[][10] = {"ghi", "def","abc", "jkl"};
std::sort( array_iterator( str ), array_iterator( str+4 ), string_less );
std::copy( str, str+4, std::ostream_iterator< char const* >( std::cout, " " ) );

return 0;
}
297デフォルトの名無しさん:04/10/01 01:06:40
>>294
これでいける

struct Array{
char c[10];
friend bool operator<(const Array &a,const Array &b){
return strcmp(a.c,b.c)<0;
}
};

std::sort((Array*)str, (Array*)(str+4));
298295:04/10/01 01:16:47
>>297
しまった・・・俺は馬鹿か・・・orz
299デフォルトの名無しさん:04/10/01 02:18:42
結局,char[10]はAssignableでもCopy Constructibleでもないため
sortに突っ込むこと自体間違っている,ということで良いですか?

>>297
(゚д゚)ウマーなんですが,reinterpret_castはなるべくなら最終手段にしたいですね.
というか,そうするなら初めから固定長文字列ラッパ使えば良いような・・・.

boostでようやくfixed_stringがレビュースケジュールに入ったので
将来的にはそれを使えばさらに(゚д゚)ウマーになるんでしょうかね.
300デフォルトの名無しさん:04/10/01 11:14:06
>>299
reinterpret_castは避けたいという気持ちはわかるが、だとしたらqsort() に出来て
std::sort() にできないことを悔しがる必要はないんじゃないか?
301デフォルトの名無しさん:04/10/01 16:06:00
boostスレを独立させようと思うのですが、皆さんのご意見をお聞かせください
302デフォルトの名無しさん:04/10/01 16:24:40
独立させるほど話題もないし
仕事おそいし
構文きもいし
303デフォルトの名無しさん:04/10/01 16:24:53
>>301
ますます閑散としてしまうような
むしろこことC++相談室の統合を考えたほうがいいような気がする
304デフォルトの名無しさん:04/10/01 16:42:22
>>301
        /\
        / ノ \,_;;,;;vv、;、
       /ノ     ,;; ;:;#ヽ  や、やめてぃょぅ
       i'       "~'"" ヽ ここの客、盗らないで。
      l    ○    ○  i;
      ;; * υ     u l
      ヽ、  ゚  (_人__丿 ノ 
       / `ヽ、__    ,ノー'"/;~;,ヽ
       /      ̄"""゙   (;;,@';,)
      ノ ヾ.,;,.∴      (´"~"" ∵
      l   ';,;@;';,    ノ     ;,.
     |  ;' ";~"    /     ;,.
305デフォルトの名無しさん:04/10/01 17:13:39
閑散とするから統合したんだよな。

勝手にSTLスレ作ってる奴いるけど。
306デフォルトの名無しさん:04/10/01 17:17:01
>301
ここで積極的にboostの話題振れば良いと思いますよ.
というか,仮にSTLスレの存在を認めるとすると
このスレにはtemplateの文法とBoostぐらいしか話題が残されていない・・・.
307デフォルトの名無しさん:04/10/01 17:18:02
このスレも全部C++スレに統合でいいと思う
308デフォルトの名無しさん:04/10/01 17:35:00
C++相談室は初心者隔離スレとして機能してるから、
せっかくのそれを破壊するのはどうかと思う。
309デフォルトの名無しさん:04/10/01 17:39:04
あれは初心者隔離スレだったのかー!w
310デフォルトの名無しさん:04/10/01 18:30:46
そして2004年10月、C++のスレは統一され長い戦国時代に終わりを告げた―――
311デフォルトの名無しさん:04/10/01 19:25:03
――2004年11月、C++のスレは再び覇権をめぐり戦いを始める
312デフォルトの名無しさん:04/10/01 20:41:22
マクロもテンプレートの一種だから
含めてもええよな?な?
313デフォルトの名無しさん:04/10/01 20:43:54
いいわけねえだろw
314デフォルトの名無しさん:04/10/01 20:47:39
>>312
それはプリプロセッサスレへ。
315デフォルトの名無しさん:04/10/01 20:48:35
そもそも分ける必要はなかった
316デフォルトの名無しさん:04/10/02 15:34:53
最近boostが特にお気に入り。
でも、ちょっと待ったー。何じゃのこのサイズ、何じゃこの遅さ。
とはあまり気にしないのですが、でも確実にそれらと比べるとDelphiの方が優れているように感じてしまう。今日この頃。
だからと言って、やめられない。
このboostを使うと今まで書き続けていたC++のコードが気色悪いほどまったく別のものになる感じが。気持ちぃいいいいい!!
317デフォルトの名無しさん:04/10/02 15:54:20
>>316
コピペの元ネタ何?
318283の原因:04/10/02 16:00:41
boost::regex_searchが
boost::smatchを再利用したときに前の状態が
残ってる場合に284のような結果になるみたい。
だから
match.swap(boost::smatch());
をwhile文の最後に追加したら
ちゃんと動きました。
319デフォルトの名無しさん:04/10/02 17:27:59
最近ム板が特にお気に入り。
でも、ちょっと待ったー。何じゃのこの厨房、何じゃこの痛さ。
とはあまり気にしないのですが、でも確実にそれらと比べるとマ板の方が優れているように感じてしまう。今日この頃。
だからと言って、やめられない。
このム板を使うと今まで書き続けていた煽りのレベルが気色悪いほどまったく別のものになる感じが。気持ちぃいいいいい!!
320デフォルトの名無しさん:04/10/02 19:32:35
316を見て思い出したのだけど、boost::shared_ptrって遅いの?
最近知ってこれいいやとちょこちょこ使っているのだけど、
ぐぐったら論外に遅いとかいう意見がひょこひょこ出てくるもので。
じぶんでつかっちえるぶんにはきにならないのでつかうけどsぁええ。
321デフォルトの名無しさん:04/10/02 19:59:07
>>320
実際にトレースして原理を調べてみれば良いと思う。
いつのタイミングでどんな処理をするのかとか。メモリをいつ、どれくらい使うかとか。
それで納得できれば使えばいいし、そうでなければ別なものを使えばいい。

参照については中に生のポインタを持っているのだから、普通のポインタと
多くの場合速度的には変わらないんじゃないだろうか。
322デフォルトの名無しさん:04/10/02 21:27:57
>>320
さすがに生ポインタと比較すると遅くなる要素は大量にあります.
ただ,shared_ptrのオーバーヘッドは局所的なものなので,
(例えば参照はずしは321さんのおっしゃるとおり生ポインタと変わらないはず)
どこに余分なコストがかかるかを理解していればそれほど気にする必要はないかと.
また,このオーバーヘッドはnon-intrusiveな共有ポインタの実装としては
ほぼ不可避なものばかりですし.
323デフォルトの名無しさん:04/10/02 21:30:31
参照はずしは生ポインタの6倍ってどっかに書いてあったような気がするけど。
324デフォルトの名無しさん:04/10/02 21:37:22
>>323
inline展開無しとかじゃねーかと
325デフォルトの名無しさん:04/10/02 21:42:58
>>323
今ソース読んでみましたけれどそんなオーバーヘッドがかかる要素は
どこにも見当たりませんでしたよ?324さんの言うとおりとか・・・
326デフォルトの名無しさん:04/10/02 22:10:37

あと設定によってはassertが入るのかな。
327デフォルトの名無しさん:04/10/03 10:36:12
shared_ptrって一度普通のポインタに格下げしてからもう一回shared_ptrに突っ込むと、
別々の参照カウンタを参照するようになって狂うんだよな。
普段は気をつけてりゃ良いけど this だけはどうしようもないから困る。
被参照オブジェクト内に参照カウンタを持たせるとか、
new に細工して頭に参照カウンタを埋め込むとか、
被参照オブジェクトに多少制限を加えることで解決出来る方法はあると思うけど、
そういう実装は無いの?
328デフォルトの名無しさん:04/10/03 10:40:25
>>327
boost::intrusive_ptr
329デフォルトの名無しさん:04/10/03 10:54:44
boostみなおしたよ(´-`)
330デフォルトの名無しさん:04/10/03 10:58:36
331290:04/10/03 14:40:16
亀レスすまそ。

>>290のstrcmpの戻り値以外の話は全て忘れてくれ。。。
なんか全然間違ったこと書きまくっていたことに気づいた。。。
orz

配列コピーなんて全然サポートされてないし、引数も問題なく渡せるはずだし。。。

そもそも半年以上まともにC/C++いじってないどころかネットもまとも
につなげられない場所なんで。。。
半年でここまでアホになれるんだと痛感してしまった。。。
やっぱり継続は力なりだな。

もうオレって( ´,_ゝ`) プッ♥
332デフォルトの名無しさん:04/10/03 15:06:35
引数に配列を渡すだけでその配列中の最小値を出せる関数ってどうやればいいでしょうか?

template <typename T>
class c
{
    template <typename U> struct s{ typedef U type; };
    template <typename U> struct s<U[?]>{ typedef U type; };
public:
    typedef typename s<T>::type type;
};

template <typename T>
inline int
numof( const T& t ){
    return sizeof( t ) / sizeof( t[ 0 ] );
}

template <typename T>
typename c<T>::type min_array( const T& t ){
    return *std::min_element( t, t + numof( t ) );
}

int main(){
    int n[] = { 1, 2, 3, 4, 5 };
    std::cout << min_array( n ) << std::endl;
    return 0;
}

頑張ってここまで考えたんですが、?にmain::nの要素数をコンパイルタイムで入れられなくて行き詰まっています…
333デフォルトの名無しさん:04/10/03 15:14:48
>>332
template <typename T, unsigned N>
T min_element(T (&ary)[N]) {
  return std::min_element(&ary[0], &ary[N]);
}
334デフォルトの名無しさん:04/10/03 15:20:48
>>333
-  return std::min_element(&ary[0], &ary[N]);
+  return *std::min_element(&ary[0], &ary[N]);
335デフォルトの名無しさん:04/10/03 15:21:09
>>333
感動しました!
ありがとうございました!!
336デフォルトの名無しさん:04/10/03 23:12:01
Qtのsignal/slotが好きだったのでboost_signals見つけて嬉しかったのだけど、
コレとlibsigc++の両方使い比べた人の感想とか聞きたい気がしたようななゆゆゆ
337デフォルトの名無しさん:04/10/04 22:55:27
boost::shared_ptr みたいに、デストラクタで関数を呼び出して
ポインタを処理する出来るだけシンプルなクラスを作りたいんですが、
以下のようにまでは考えられたんですが、デストラクタでの
f の呼び出し方がわかりません。どうすればよいでしょうか…?

template <typename T>
class smart_ptr{
public:
    template <typename U, typename F> smart_ptr( U* ptr, F f ) : p( ptr ){}
    ~smart_ptr() throw(){}
private:
    T* p;
};

void f( int* p ){
    delete p;
}

int main(){
    smart_ptr<int> s( new int, f );
    return 0;
}
338デフォルトの名無しさん:04/10/04 23:44:44
これじゃいかんの?
template <typename T>
class smart_ptr
{
public:
  typedef void F(T*);
  template <typename U> smart_ptr(U* p, F f) : p_(p), func_(f){}
  ~smart_ptr(){func_(p_);}
private:
  T* p_;
  F* func_;
};

void f(int* p)
{
  delete p;
}

int main(){
  smart_ptr<int> s(new int, f);
  return 0;
}
339デフォルトの名無しさん:04/10/05 23:00:32
ダメなんじゃない?いや、たぶん
340デフォルトの名無しさん:04/10/05 23:32:12
void (*)(T*)な関数を呼び出したいだけなら338で良いんじゃないですか?
ファンクタも呼び出せるようにしたいならもう一押し要ると思いますが.

template <typename T>
class smart_ptr
{
public:
  template <typename U, typename F>
  smart_ptr(U* p, F f) : p_(p), func_(f){}
  ~smart_ptr(){func_(p_);}
private:
  T* p_;
  boost::function<void (T*)> func_;
};

とか.
341デフォルトの名無しさん:04/10/06 18:45:03
バイト配列を簡単に扱えるクラスってSTLにありますか?
stream系で何かありそうなんですが、よく分かりません。
342デフォルトの名無しさん:04/10/06 18:49:16
>>341
std::vector< unsigned char > じゃ不満なの?
343デフォルトの名無しさん:04/10/06 18:52:31
>>341
"簡単"の定義による
344341:04/10/06 19:03:18
えー、簡単ってのは<<の演算子で追加できるようなやつです。
345デフォルトの名無しさん:04/10/06 19:17:30
vectorならpush_backで追加できるが。
346デフォルトの名無しさん:04/10/06 19:21:35
std::vector<unsigned char>& operator<<(std::vector<unsigned char>& v, unsigned char c)
{
v.push_back(c);
return v;
}
347341:04/10/06 19:40:28
>>346のやり方で、
unsigned charじゃなくて、unsigned charの配列を追加するには
どうしたらいいんでしょうか。
要素の長さだけforで繰り返すんですか?
348デフォルトの名無しさん:04/10/06 19:57:18
>>347
どうしても<<がいいのか?
STLには
std::copy( a, a+n, std::back_inserter( c ) );
という決まり文句があるんだが。
349デフォルトの名無しさん:04/10/06 20:01:46
vector なら copy じゃなく insert 使えやボケ
350デフォルトの名無しさん:04/10/06 20:03:01
Ruby ?????????>>>>>>>>>>>>>>>>>>>>>>>>> C++
351!=348:04/10/06 21:56:32
back_inserterは内部でinsert使うと思うんだが。
352デフォルトの名無しさん:04/10/06 22:07:03
v.insert(v.end(), c, c+n);
ってことじゃね?
353デフォルトの名無しさん:04/10/06 22:08:08
>>344
そういうのならstringstreamはどう?
354353:04/10/06 22:09:35
もちろんそのunsigned charの配列が'\0'終端されていないと無理だよ。
355デフォルトの名無しさん:04/10/07 01:35:55
別スレで紹介されてた↓
ttp://www.gotw.ca/publications/mill17.htm
を読んでおどろいた。

template<class T> void f( T ) {}
template<class T> void f( T* ) {}
template<> void f<>(int*) {}
と書くのと
template<class T> void f( T ) {}
template<> void f<>(int*) {}
template<class T> void f( T* ) {}
と書くのじゃ順番が違うだけなのに
f((int*)0);
の結果が変わるなんてまったく知らなかったーよ
356デフォルトの名無しさん:04/10/07 02:03:03
12へぇくらいかな
357デフォルトの名無しさん:04/10/07 02:13:11
>と書くのじゃ順番が違うだけなのに

順番が違ったら大違いだと思うが。
358デフォルトの名無しさん:04/10/07 02:50:19
>>351
back_inserter は push_back だよー
359デフォルトの名無しさん:04/10/07 02:54:38
reserveしてからcopy、かな。
360デフォルトの名無しさん:04/10/07 02:55:17
>>359
insertでいいだろ。
361デフォルトの名無しさん:04/10/07 02:56:05
なんでもいいや
362デフォルトの名無しさん:04/10/07 11:05:10
>>355
これVC6だとC2667, C2668が出る(´・ω・`)
どう違うんですか?
363デフォルトの名無しさん:04/10/07 11:18:32
>>362
リンク先読めよ。
364デフォルトの名無しさん:04/10/07 12:19:30
素でURL書いてあるの見えてなかった。
スマンカッタ
365デフォルトの名無しさん:04/10/07 12:45:34
その前にVC6のテンプレートを期待してはいけない。
366デフォルトの名無しさん:04/10/07 12:47:52
VC6のってANSI準拠じゃねーだろ
367デフォルトの名無しさん:04/10/07 13:06:45
ANSI?
368デフォルトの名無しさん:04/10/07 13:30:25
ANSI
369デフォルトの名無しさん:04/10/07 13:40:33
ANSIより緊急連絡
370デフォルトの名無しさん:04/10/07 15:00:38
メデー、メデー。
こちらVC6。本部応答願います。
371デフォルトの名無しさん:04/10/07 19:28:05
ANSIタンハァハァ
372デフォルトの名無しさん:04/10/07 19:39:30
ANSIタンのおかげで安心。
373デフォルトの名無しさん:04/10/07 21:11:45
イテレータとポインタの違いを教えてください
374デフォルトの名無しさん:04/10/07 21:29:40
iterator->iterator, proxy パターン
pointer->ただのポインタ
375373:04/10/07 21:31:07
えーと、そういうことじゃなくて、
使う上で注意するべきことというか、
ポインタの代わりとしてイテレータが使えない場合があるのかどうか
聞きたかったんです。
376デフォルトの名無しさん:04/10/07 21:33:53
>>375
もう少し具体的に。
377デフォルトの名無しさん:04/10/07 21:43:14
>>375
イテレータはイテレートできてポインタとしても扱えるもの。
例えば、vectorならポインタもイテレータも同じだけど、
listだとポインタでイテレートできない。

こんな説明でいい?
378デフォルトの名無しさん:04/10/07 21:57:34
↑バカ。
リストでも大抵list->next等でイテレートできるだろ
もろポインタ。
つーか辿る手段がないものをリストとは言わない
例えるなら集合とかにしとけ
379デフォルトの名無しさん:04/10/07 22:04:51
>>377-378
話がかみ合ってないぞ。
ここはC++のtemplateスレだから377が言ってるのは、list.begin()で取れるイテレータのことだと考えた方がいい。
vectorの場合 vec.begin() じゃ無くて &vec[0] でも列挙できるが
listの場合 &list[0] はダメと言いたかったんだろう。
380デフォルトの名無しさん:04/10/07 22:06:36
いや、あれだろ、std::つけろやってことだ。
381デフォルトの名無しさん:04/10/07 22:13:38
>>375
ポインターと別物として考えてください。
イテレータの代わりにポインターは使えるけど
ポインターの代わりにはイテレータは使えない。
382デフォルトの名無しさん:04/10/07 22:15:50
イテレータ⊃ポインタ
ってこった
383デフォルトの名無しさん:04/10/07 22:27:04
>>373
例えば、STLコンテナのイテレータとしてクラスが使われている
場合は「--container.end()」は何も問題ないが、生のポインタが
使われている場合は「--container.end()」はエラーになる。
384デフォルトの名無しさん:04/10/07 22:27:18
STLのイテレータは、
ポインタのインターフェイスで、
STLのコンテナ間の実装の差異を埋めるためのものでしょ。

じゃあ、全部ランダムアクセスにしろと。
385デフォルトの名無しさん:04/10/07 22:29:13
>>384
歴史的な順番としてはそうかもしれないが、言語を作った側の
意図としては順番が逆なのでは?つまり、ポインタがランダム
アクセスイテレータの一形態に過ぎないという。
386デフォルトの名無しさん:04/10/07 22:30:35
>>382
イテレータ⊊ポインター
でしょ。
387デフォルトの名無しさん:04/10/07 22:42:33
>>381=386
388デフォルトの名無しさん:04/10/07 22:44:33
ポインタ=神
イテレータ=サーバント
389386:04/10/07 22:51:21
>>387
そうかな~?
390デフォルトの名無しさん:04/10/07 22:54:06
サイズ
イテレータ>=ポインター
391デフォルトの名無しさん:04/10/07 22:55:54
>>389
ランダムアクセスイテレータじゃないとポインタで代わりにならないよ。
392デフォルトの名無しさん:04/10/07 22:57:42
>>385 は無視かよ
393デフォルトの名無しさん:04/10/07 22:59:46
>>390
とは限らない。
394デフォルトの名無しさん:04/10/07 23:04:58
>>393
実装によってはイテレータがポインタを保持しない場合ってのがあるの?
395デフォルトの名無しさん:04/10/07 23:08:06
>>394
列挙対象がシステムで唯一なら何も持つ必要は無いし、
配列で管理されていればそのインデックスを持つだけでも良い。
396デフォルトの名無しさん:04/10/07 23:09:28
ポインタはランダムアクセスイテレータコンセプトのモデルである
397デフォルトの名無しさん:04/10/07 23:11:58
>>395
STLの話じゃないの?
398デフォルトの名無しさん:04/10/07 23:15:32
>>397
STLのイテレータの話(らしい)けど、STLのコンテナのイテレータの話じゃない。
399デフォルトの名無しさん:04/10/07 23:16:21
>>398
なるほど。
400デフォルトの名無しさん:04/10/07 23:25:57
>>395
参照演算子はどうするの?
401デフォルトの名無しさん:04/10/07 23:26:29
>>394
ゼロレジスタみたいに、常に参照はがしするとゼロを返すイテレータとかも
ありだしね。理論的には。
402386:04/10/07 23:27:18
>>385+>>396
で考えると
RandomAccessIterator<T> : private T*{・・・};
OteraIterator : private T*{・・・} となるけど
T* : private RandomAccessIterator<T>, private OtherIterator<T>{・・・}の方がしっくりこない。
403デフォルトの名無しさん:04/10/07 23:42:33
>>402
コンセプト同士の関係 (refinement) は、継承じゃ記述できんぞ。言いたいことは
分かるが。
404デフォルトの名無しさん:04/10/08 01:15:16
「コンセプト」と「コンセプトのモデル」をごちゃ混ぜに語っている
人が多くて,どうにも議論が追いにくい・・・.

>403
コンセプトをインターフェースクラスとして表現した上で,
Refinementの関係をインターフェースクラス間の継承関係で表現できないですかね?
(昔この手の提案があったはず)
あとコンセプトのRefinementの関係を,コンセプトに1対1対応させたタグの
継承関係で表現する手法はありますよね.(iterator_categoryとか)
405デフォルトの名無しさん:04/10/08 01:19:21
>>404
> Refinementの関係をインターフェースクラス間の継承関係で表現できないですかね?
C++ だと operator は継承できないし、できたとしても Assignable とかはクラス
としては記述しようがないかと。operator=() が定義されてることと Assignable で
あることは違うし (std::auto_ptr とかさ)。
406デフォルトの名無しさん:04/10/08 01:29:12
>405
確かに,よくよく考えてみれば他にも例えばoperator+等は
メンバかグローバルか両方の可能性がありますしね.
有効式(Valid Expression)の要求が抽象的(構文が通るかどうか)過ぎて
インターフェースクラスで表現するには限界がありますね.失礼しました.
407406:04/10/08 01:40:50
-有効式(Valid Expression)の要求が
+有効式(Valid Expression)のようなsyntaxの要求ですら

ましてやsemanticな要求は・・・ですね.
408386:04/10/08 02:11:00
>>403-404
ああ。なるほど。どうやらみなさんと考えてる部分が違ったのですね。
すんません。ペコペコ
409デフォルトの名無しさん:04/10/08 02:31:36
おめーら、stlsoftは使ってますか?
410デフォルトの名無しさん:04/10/08 03:23:28
>>409
君、ドイツの子?
411デフォルトの名無しさん:04/10/08 22:36:16
おらんだ
412デフォルトの名無しさん:04/10/08 22:58:03
> C++ だと operator は継承できないし
てどういう意味?
413デフォルトの名無しさん:04/10/08 23:23:27
>>412
そのままだが。C++ の言語仕様。
414デフォルトの名無しさん:04/10/08 23:33:43
>413 VC7.1付属MSDNライブラリより。
・All overloaded operators except assignment (operator=) are inherited by derived classes.
415デフォルトの名無しさん:04/10/08 23:53:42
あと単項演算子はともかく、二項演算子はフリー関数にして friend 宣言することが
多いから、継承も何もないわな。
416デフォルトの名無しさん:04/10/09 01:36:33
継承できない(しない)のはoperator=だけだろ
それとフリー関数で提供した場合は継承は関係ないが
"要求"は保存される
(コンセプトとは要求の集合である、という文脈で)
417デフォルトの名無しさん:04/10/09 10:23:14
>>416 台風接近中
厨を晒してる場合じゃないぞ
418413:04/10/09 11:21:47
>>414
なんか微妙に荒れてるが、俺の勘違いってコトで。ゴメンね。
# define BOOST_MPL_PREPROCESSED_HEADER apply.hpp
# include "boost/mpl/aux_/include_preprocessed.hpp"
この2行がすべてを無意味にする恐ろしいヘッダファイルであった。
因み環境vc7.1。
420デフォルトの名無しさん:04/10/10 18:38:54
詳しく
421確かにこれは恐ろしいw:04/10/10 19:33:33
>419
無意味になったのは「マクロの嵐を必死こいて解読した努力」ですか?w
422デフォルトの名無しさん:04/10/10 20:29:03
いやなことでもあったの?
423デフォルトの名無しさん:04/10/10 20:30:36
>マクロの嵐、
俺は洟から解読をあきらめた
424419:04/10/10 20:34:02
>>421
あはは。それが8割ほどですかね。
このヘッダファイルはなんか罠のある迷路みたいで疲れた。orz
以下無知な俺が得た成果なんだけどはっきり言ってバカです。・・・・・・・。

マクロ切り替えを解読するのがめんどくさかったから
AUX_APPLY_N_PARTIAL_SPEC_PARAMSなどのテンプレで使われてるものから解読していって
いざコンパイルして型をみてみたら 「あれ?予想と違う型になってもおた」 てな具合になってあわてました。
で、なくなくマクロ切り替えも見てみたら>>419で書いた部分が
#define BOOST_MPL_NO_PREPROCESSED_HEADERS
これを定義してないとそのままマクロ展開されてboost/mpl/aux_/preprocessed/適切なディレクトリ/apply.hppこれをインクルードして
mpl/apply.hppヘッダの役目を終えてしまう仕組みになってたんでね。
425デフォルトの名無しさん:04/10/10 21:10:24
>>419
>>424

ここはお前の日記帳じゃねーんだ。

広告の裏にでも書いてろ。


な。
426デフォルトの名無しさん:04/10/10 21:29:30
421は煽りっぽく読めますね,すいませぬ.

>424
PP多用したboostのコード読むときは使っているコンパイラに
PPの結果だけ吐かせてそれを整形して読んだ方が速いですよ.
427424:04/10/10 21:53:05
>>426
わざわざ助言ありがとう。
でも、実はすでにブリプロセスファイルを生成して確認をしてるんですよね。申し訳ない。

>>425
アイアイサー。
しかし、また書く時あるかも・・・・・あしからず。
428デフォルトの名無しさん:04/10/12 02:50:53
( ゚д゚)ポカーン
429デフォルトの名無しさん:04/10/12 15:20:54
プリプロセスをPPって書く人を始めてみました
430デフォルトの名無しさん:04/10/12 16:12:37
cpp
431デフォルトの名無しさん:04/10/12 16:54:42
Boost.PPって正式名称じゃないか?
432デフォルトの名無しさん:04/10/12 20:16:11
$ cpp 429.cpp
433デフォルトの名無しさん:04/10/13 05:48:00
>>429
出会いが少ないから
434デフォルトの名無しさん:04/10/13 14:00:15
str += "aiueo";
とは別の方法としての

std::string str;
str.reserve(6);
strcpy(&str[0], "aiueo");
は問題ない使い方でしょうか?
435デフォルトの名無しさん:04/10/13 14:03:56
>>434
>&str[0]
こんなの渡すのは通常は問題じゃないの?
436434:04/10/13 14:11:03
>>435
では(書き込み用に)文字配列(バッファポインタ)を要求するような関数に
std::stringを渡す事は出来ないのでしょうか?
437434:04/10/13 14:15:17
参照カウンタで文字列を共有するような実装ならポインタ渡したらまずいですかね。
素直にstd::vector<char>とか渡せばいいのかな。
438デフォルトの名無しさん:04/10/13 14:21:44
(とりあえず434はresize?)
書き込んだ結果途中で\0なんか入れられたら
訳分からんことにもなろうし
439デフォルトの名無しさん:04/10/13 14:45:02
>>434
STLスレで見かけたんだけどstd::stringではstd::vectorと違い要素が連続していなくてもいいらしい。
そんなのありえないだろうけどやめとけ。
440434:04/10/13 15:12:44
>>438-439
後で原因不明のバグになったらイヤなのでやめときます。
ありがとう。
441デフォルトの名無しさん:04/10/13 15:22:55
こーゆう話題がでるのでC++スレにこのスレとSTLスレは
もうそろそろ統合する時期なのかも。
Boostスレはまだ統合しなくてもいいけど。
442デフォルトの名無しさん:04/10/13 15:31:01
>>441
そろそろ統合する時期っつーか、
C++とtemplateの2スレでやってきたところに
突然このスレが発生したわけだが。
443デフォルトの名無しさん:04/10/13 16:39:23
>442
444デフォルトの名無しさん:04/10/13 17:20:25
>>434の「reserve()」ってとこには誰も突っ込まないのか?
445444:04/10/13 17:21:58
>>438が突っ込んでた、スマン
446デフォルトの名無しさん:04/10/14 02:08:00
BorlandのBuilderとVC(MFC)で使っている
自作のクラスの中でメモリを確保していた部分を
vectorで書き直そうと思っているのですが,
互換性などは問題ないのでしょうか?
STLと一言で言ってもライブラリを作っているところは
いろいろあると書いてあったので.
447デフォルトの名無しさん:04/10/14 02:11:58
>>446
> 自作のクラスの中でメモリを確保していた部分を

って何?
new char[] ?
448デフォルトの名無しさん:04/10/14 02:11:59
規格通りにSTLを使って、規格通りのコンパイラでコンパイルするなら
問題ない。心配ならSTLPortでも使うといい。
449デフォルトの名無しさん:04/10/14 02:18:20
>>447
自作のクラスAの中でクラスBの配列を動的にnewで生成してたんですが,
その部分をvectorで書き換えるとBの最大値を簡単に変更できて
便利だと思いまして.
450デフォルトの名無しさん:04/10/14 02:19:33
すいません,449=446です.
451デフォルトの名無しさん:04/10/14 02:20:13
>>449
そゆ事ならどんどんやってください。

最大値→サイズ
452デフォルトの名無しさん:04/10/15 21:11:06
boost本のlambdaの解説にて疑問に思いました
for_eachのみ(無名関数)で頑張るために新しい文法(lambdaの)を駆使するより
普通に関数つくるかforループ回したほうがよくないですか?
最初のサンプルで簡潔に書けることを示している部分には同意しますが
例外処理してる部分なんてみにくいだけのような気がします
(こんなことも出来るよサンプルだとは思います)
私の理解不足でしょうか。
453デフォルトの名無しさん:04/10/15 21:17:16
問題は、lambdaを無理矢理がんばって実装してることにある。
おとなしく言語仕様に加えろと。
454デフォルトの名無しさん:04/10/15 21:18:46
おとなしくD言語に移行しろってことか
455452:04/10/15 21:35:02
たしかにリファレンスを見ているだけで無理矢理感がつたわってきますね
関数内のローカル関数がかければ随分違ってくるのでしょうか
sortの比較にちょちょっと使う程度なら便利だよってことでしょうか
456デフォルトの名無しさん:04/10/15 21:45:16
template 引数が外部リンケージ(でしたっけ?)を持たなければいけないという仕様はなぜ生まれたのでしょうか。
関数内のクラスをテンプレートに渡したいと思う場面は頻繁に発生します。
457デフォルトの名無しさん:04/10/15 22:21:05
頻繁?
458デフォルトの名無しさん:04/10/15 22:31:28
>>456
> template 引数が外部リンケージ(でしたっけ?)を持たなければいけないという仕様はなぜ生まれたのでしょうか。
おそらく、テンプレートがインライン展開されなかった場合のシンボルが重複しない
ように、だと思われ。
459デフォルトの名無しさん:04/10/15 22:38:36
>>456
安心しろ、俺も頻繁だ。
460デフォルトの名無しさん:04/10/15 23:35:11
461デフォルトの名無しさん:04/10/15 23:50:04
マクロを見ると鳥肌が立つのは俺だけか?
462デフォルトの名無しさん:04/10/16 00:03:23
マ○○を見ると○○が立つのは俺だけか?
463デフォルトの名無しさん:04/10/16 00:03:53
>>460
結局のところ、どんなに頑張っても…、という空しさが募るばかりです。
464デフォルトの名無しさん:04/10/16 00:25:51
C++が糞であることの何よりの証拠だな。
さっさとRubyに移行しろ低能ども
465デフォルトの名無しさん:04/10/16 00:33:13
>>462
安心しろ、俺もだ。
466デフォルトの名無しさん:04/10/16 00:40:00
珍宝
467デフォルトの名無しさん:04/10/16 01:03:21
でも別に珍しくはない
468デフォルトの名無しさん:04/10/16 01:07:31
正直、lambdaがあってもそんなに便利になるとも思えないんだけど
サンプルコードとかテストコード書くときはちょっと便利そうだけど

俺の理解が浅いだけかな
469デフォルトの名無しさん:04/10/16 01:08:01
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>C++
470デフォルトの名無しさん:04/10/16 01:35:10
>>468
> 正直、lambdaがあってもそんなに便利になるとも思えないんだけど
compose や bind をネストして書いてると、C++ のコード書いてるんだか
Lisp プログラミングしてるんだか分からなくなるぞ(w
471デフォルトの名無しさん:04/10/16 01:36:59
>>468
知らないってのは哀れなことだ。
世界がC++で閉じてるんだろ?
しかもそのC++も十分使いこなしてないだろ?
472デフォルトの名無しさん:04/10/16 01:39:33
>>471
lambdaが便利だという例を示してくれ。
可読性落としても分かりにくいコード書いて嬉しいか?

LispならともかくC++でlambdaって意味わかんね。
473デフォルトの名無しさん:04/10/16 01:46:43
boost::lambdaの話なのか、lambda一般の話なのか解からないのは俺だけだ。
474デフォルトの名無しさん:04/10/16 01:49:34
まなな?
475デフォルトの名無しさん:04/10/16 01:50:28
でも、実際ラムダ使えねーけど。
整数にる内部足し算は可能なのに
(var(m)=_1+_2)(n,k)・・・・・・ok
オブジェクトによるもろもろの操作が出来ない・・・・coutは出来るのに
(var(ob)=_1+_2)(n,k)・・・・・NG 
メンバー正しく呼び出せない (+-*/%=,etc…)はラムダのメンバー関数で解釈されるからだと思うんだけど。
解決方法にbind(C::get,bind(operator+,_1,_2),var(m))(c1,c2);
こんなことやってらんないし。
476デフォルトの名無しさん:04/10/16 01:58:23
>>472
良くあるのが構造体中の一要素をキーとして、何かする場合。

struct foo { int key; int val; };
std::vector<foo> foo_list;

using namespace lambda;
// key が 3 のものを探す
std::find_if(foo_list.begin(), foo_list.end(), bind(&foo::key, _1) == 3);
// key の昇順でソートする
std::sort(foo_list.begin(), foo_list.end(), bind(&foo::key, _1) < bind(&foo::key, _2));

いちいちファンクタ作るのも面倒だし、まして SGI STL にある compose とか
組み合わせて作ってたら、可読性の悪さは boost::lambda の比じゃない。
477デフォルトの名無しさん:04/10/16 02:04:17
>>475
okとNGは何が違うの?
478デフォルトの名無しさん:04/10/16 02:08:35
俺いちいちファンクタつくっちゃうなぁ
その方がコンパイル速いし 可読性もあるし
479デフォルトの名無しさん:04/10/16 02:11:33
>475
ob, n, kがユーザ定義型なんですか?もしそうならret使ってくださいな.
http://tinyurl.com/5dyye
480デフォルトの名無しさん:04/10/16 02:16:04
if_とかwhile_を使った面白い例とかないの?
481479:04/10/16 02:18:19
癖で英語のドキュメント指しちゃった.
日本語ドキュメントはこっち.
http://tinyurl.com/4copy
あと,これも.
http://tinyurl.com/6tnv9
482デフォルトの名無しさん:04/10/16 02:20:44
>>478
> その方がコンパイル速いし 可読性もあるし
コンパイル速度はともかく、可読性は慣れのような気がする。さすがに
boost::bind() を 3 つも 4 つもネストさせて合成関数作るようなコードは
アレだが、476 程度で「読みにくい」っつーことはあるまい。
483デフォルトの名無しさん:04/10/16 03:46:36
>>477-479
Cをユーザー定義型として、friendのoperator+を持っています。
で、先の式の説明をいたしますと
C c(10), d(20), m(0);
(var(m) = _1 + _2)(c,d);
ラムダ式でmに代入をするという目的だけの式が作れないんですよ。
なんで?って感じでいまだに謎のままです。
484デフォルトの名無しさん:04/10/16 04:29:15
>>483
lambdaは内部に戻り値の型を推論するための特殊な機構を使っています.
組み込み型の演算子の戻り値型推論,例えばint + intの戻り値がintになるといったような推論は
ライブラリに元から組み込まれていますけれど,ユーザ定義型に対しては定義されていません.
なので,以下のどちらかが必要になります.

その1:retでoperator+(C,C)の戻り値の型を明示する
(var(m) = ret<C>(_1 + _2))(c, d);

その2:Boost.Lambda内の戻り値型推論機構をCに対して特殊化する
// 先にlambda.hppをインクルードしておく
namespace boost{namespace lambda{
// operator+(C,C)の戻り値の型をCに指定する
// これを一度定義しておくと以降は+に対してretを指定する必要はなくなる
template<> struct plain_return_type_2<arithmetic_action<plus_action>,C,C>
{ typedef C type; };
}}

詳しくは481に挙げたドキュメントを参照してください.
485デフォルトの名無しさん:04/10/16 05:13:02
>>484
おฺぉฺすฺげฺぇฺ〰ฺ
ってゆう前にごめんなさい。よく読んで無かったですね。
「Extending return type deduction system」もろですね。
486デフォルトの名無しさん:04/10/16 06:57:56
lambda使わないと、ファンクタ一個作るために
構造体の定義書いて、さらにそこでしか使わないようなファンクタなら
無名namespaceで囲わなきゃいけないから面倒だし、
構造体の定義は関数中に書いてもテンプレート引数には渡せないから
わざわざグローバルなスコープに戻って定義しなきゃならん。
これだと読むときにも、いちいちファンクタの定義探すのが面倒なんだよね。

ただ、さすがにforループとか例外までlambdaで使う気にはなれんけど。
そこまでやるなら、関数に切り分けた方がいいと俺の構造的プログラミング勘が申しております。
487デフォルトの名無しさん:04/10/16 07:13:38
C++の仕様って、STLに向いてないよな。
488デフォルトの名無しさん:04/10/16 15:49:58
たとえ_1+_2程度でも俺は関数にする。
そこはケチるところではないと思う。


と半年Java漬けで毒されつつある俺は思う。
489デフォルトの名無しさん:04/10/16 16:55:26
関係ないけど自作処理系でlambda使える様にした。
結局これはインラインで滞りなく書けることに意義があるんだよ。
boost::lambdaは実装者の自己満足でしかない。
490デフォルトの名無しさん:04/10/16 17:04:48
仕事だと、まず C/C++ であることに意義がある場合が多いわけだが。
491デフォルトの名無しさん:04/10/16 17:22:50
>>490
Cだよ
492デフォルトの名無しさん:04/10/16 17:29:55
実用言語に非実用的なライブラリは要らない
493デフォルトの名無しさん:04/10/16 17:51:16
使わなきゃいいじゃん……
494デフォルトの名無しさん:04/10/16 18:29:50
boostみたいな準・標準ともいえるライブラリに変なのが混ざってると
逆に迷惑かも
scanfやstrtokみたいな弊害というか
495デフォルトの名無しさん:04/10/16 18:32:52
使わなきゃいいじゃん。
boostは
正式に標準なわけでも正式に準標準なわけでもないのだから。
496デフォルトの名無しさん:04/10/16 19:45:45
でも今更boost::formatやboost::regexは手放せないよなぁ。
497デフォルトの名無しさん:04/10/16 20:07:51
boost::regexより鬼車とかの方が(・∀・)イイ!
498デフォルトの名無しさん:04/10/16 21:15:38
          __  ,,,,,,,  - -ー―-  、
       ┌ー|                  ヽ、
       /  .|                   ヽ、
      /    .|                    ヽ
      /    〉                     .ヽ
     , '/  !  ハ  ヽ                  り
    ,.' /  !!  ! ヽ  |ヽ         :::::!    ::  ::! ::',
   / /   ! ! !  ヽ  ! ヽ           :::.!   :::  :::::! :;
  / ,リ :::::::!.! !    ヽ ! ヽ  ヽ      ::!   :::  :::::! :!
  ! ハ ::::::::::! ! .!    ヽ .!  ヽ  ヾ、      !  ::::  :::::!  :!  なんなのよこいつら・・・
  ! ; ! .::::::::::!__!」,,,    ヾ__\__ヽ,,, :::::::::!  .::::  ::::::! .:::',
  レ' .! :::::! :::ヽ ヾ ミヽ   ヽ ̄  ̄ヽ、ヽ`:::::::.! .::::  .::::/  :::::',
    ! :::!i ::::::::!《てソヽ     "ソて)~ミミア .::: .:::::/:::: !:人ヽ
    ', ::! ',::::::::ヾ. r ';;ヘ      "  ヽ ;;;;;。ソy :::/ ..:::::メ:::::: !:::::!`-ゝ
    ',::!. ', ::::::::', ゝ彡゚         ゝー"/:::イ .::::メノ::::::リ、:::!
     'ソ . ',从::::',   ,           ///  彳' N:::リ ヽ:!
     i!  ヾ、:::ヽ  `         /",/ /:::: ハ:リ  ソ
         ヾ:::!ゝ   ヽつ   u ,/,/:/:::::::::/ V
          V  丶、   ,, - ":::::::レ'!:::::八 :l
               ` ーヾ!:::::::::::::::  ,!ゝソ .V
                 イ ,!:::::::   /   \
              , -'"/  ヘ ___/   .! !. \
         , - '"  // , ク-くヾ     ! !:::::::::\
      , - '"     ,///イ   ヽヽ   //   :::::::゙ -、_
              ヾ;ン" 〉-、/ヽヽニ彡         ゙-、_
499デフォルトの名無しさん:04/10/16 21:34:49
boostは10年後も準々標準ライブラリだと見切りコンビ。
500デフォルトの名無しさん:04/10/16 22:17:42
boostは俺の愛奴隷です
501デフォルトの名無しさん:04/10/16 22:24:42
502デフォルトの名無しさん:04/10/16 22:28:19
>>501
まだ現役スレがあるのか……
503デフォルトの名無しさん:04/10/16 23:59:52
冬子萌え━━━━━━(´ω`)━━━━━━!!!!!
504デフォルトの名無しさん:04/10/17 16:44:28
policyってどうして多重継承で実現されてるんですか?
ふつうに委譲で怪傑できないんですか?
505デフォルトの名無しさん:04/10/17 17:05:41
>>504
委譲でもいけるし、STL でも iterator_traits なんかはそうなってると思うが。
具体例プリーズ。
506デフォルトの名無しさん:04/10/17 17:06:02
http://www.boost.org/more/generic_programming.html#policy

>They are inherited from, or contained within, other classes.

このAndrei Alexandrescuの定義だと委譲によるものもポリシーと呼べるんじゃないですかね.
507デフォルトの名無しさん:04/10/17 17:43:50
継承によってポリシーを実現するとき、ホストクラスが要求する
メソッド群をprotectedにするのは悪いっすか?
508デフォルトの名無しさん:04/10/17 17:44:17
>>504
>>506のヤシの本に理由が書いてあった気がする。
すっかり忘れた上に手元に無いので答えられないが。
移譲の場合、スコープ解決演算子とかを使って定義位置を明確にしないと呼び出せないあたりだったかも。
509デフォルトの名無しさん:04/10/17 18:41:01
>>507
protectedにしても機能するんならいいんじゃない?
わざとそうする理由あるか別だが
510デフォルトの名無しさん:04/10/17 20:55:19
>>504
継承を使うと、特定のポリシクラスにpublicなメンバを追加することで、
そのポリシとホストクラスを組み合わせたときの公開インタフェースを
後付けで拡張できる。ホストクラスを変更することなく、ね。
...というのが理由だったような気がする。

>>507
ポリシクラスのprotectedなメンバはホストクラスの公開インタフェースにならない。
公開されたくないメンバはprotected、そのまま公開したいメンバはpublicがよさげ。
ただ、あまりこだわると面倒かも。
511デフォルトの名無しさん:04/10/17 21:15:07
>>510
インタフェースを後付けで拡張できるっていいね。

アルゴリズムが共通性でインタフェースが可変って、GoFスレで
話題になってるマルチパラダイム
512デフォルトの名無しさん:04/10/17 21:23:48
> アルゴリズムが共通性でインタフェースが可変って、
それって adapter で切り替えるのと比べて なんか違うの?
513デフォルトの名無しさん:04/10/17 23:01:23
ライブラリが直接ユーザー提供のインタフェースを身にまとう
のとadapterで切り替えるのじゃ違うべ

実用的にどう違うか説明できん鬱
514デフォルトの名無しさん:04/10/18 01:00:17
>>510
>継承を使うと、特定のポリシクラスにpublicなメンバを追加することで、
>そのポリシとホストクラスを組み合わせたときの公開インタフェースを
>後付けで拡張できる。
これって結構危ない気がするんですけどどうなんですかね?
ホストクラスの名前空間をユーザの側で自由に汚せるのが気になるんですが・・・.
特にホストクラスの非公開インターフェース(通常ユーザには明示されない)と
ユーザがポリシークラスに追加した公開インターフェースが衝突したら
目も当てられないと思うんです.
ポリシーはあくまでライブラリ設計者が想定する有限の選択肢
(公開インターフェースの可否を含む)の中から
ユーザが選択するようにするのが安全だと思うのですが,どうでしょうか?
515デフォルトの名無しさん:04/10/18 01:19:34
Exceptional C++に指針が載ってたわ(項目25)
  public継承では、リスコフの代入規則に則り、IS-AとWORKS-LIKE-Aの両方の
  モデルが成り立つことを常に確認しておくこと。オーバーライドされたメンバ関数は
  「それ以上も、それ以下も要求しない」が原則である
だって。
516デフォルトの名無しさん:04/10/18 07:05:39
>>504
継承にしとかないと、空のポリシークラスがサイズを持ってしまうのが問題なんじゃないの?
517デフォルトの名無しさん:04/10/18 14:27:52
>>514
>ホストクラスの非公開インターフェースとユーザがポリシークラスに
>追加した公開インターフェースが衝突したら目も当てられない

非公開インターフェースといえどもソースコード上見えてるんだから
普通そんなことにはならないだろ
518510:04/10/18 22:01:36
>>514
> これって結構危ない気がするんですけどどうなんですかね?
基本的にyes。

> ポリシーはあくまでライブラリ設計者が想定する有限の選択肢
> (公開インターフェースの可否を含む)の中から
> ユーザが選択するようにするのが安全だと思うのですが,どうでしょうか?
基本的にyes。

多重継承によるポリシ切替は、型パラメータで基底クラスを取り替えるという
ある意味乱暴な実現手段を使っているということを念頭に置いた方がよい。
これはC++本来の基本設計で想定された使い方ではないだろうし、
リスコフ置換則に従っているとも言い難い。トリックを駆使しているんだから、
処理系がプログラマのミスに気づいてくれないこともある。

だから、ポリシ+ホストという実装方法は慎重に扱わなければならない。
これだけでもあまり安全な使い方ではないんだから、ホストクラスの
想定から外れるポリシクラスはなおのこと慎重に使う必要がある。
トリックを使うコストに見合う利益が得られるときのみに限り、
基本から逸脱した使い方をするべき。

>>516
> 継承にしとかないと、空のポリシークラスがサイズを持ってしまう
見落としてた。どちらかというとサイズ問題の方が重要かも。
519513:04/10/19 18:10:56
>>514
> これって結構危ない気がするんですけどどうなんですかね?
ある程度yes。

> ポリシーはあくまでライブラリ設計者が想定する有限の選択肢
> (公開インターフェースの可否を含む)の中から
> ユーザが選択するようにするのが安全だと思うのですが,どうでしょうか?
基本的にno。

多重継承によるポリシ切替は、型パラメータで基底クラスが取り替えるという
ある意味これまでと違うパラダイムを使っているということを念頭に置いた方がよい。
これはインタフェースを中心に据える古典的な設計で想定された使い方ではない
だろうけど、Liskov置換則に従ってやる分には問題ない。
ただし、多重継承を利用して切り替えるポリシと委譲によって切り替えるポリシの
選別はホストクラス側で注意深くやってくれているとの前提に立ってのことだ。

確かにポリシ+ホストという実装方法は慎重に扱わなければならない。
各々のポリシクラスの"意味"はホストクラスの想定範囲内になければならない(High
Cohesionを保つという意味で)。だが実際にどんなインタフェースを提供するかは
ホストクラスの監督範囲外だ。
何が"基本"であり何が"逸脱"であるかはパラダイムによって異なる。

>>516
> 継承にしとかないと、空のポリシークラスがサイズを持ってしまう
サイズ問題が重要な場合は無視できないでしょうね。
520デフォルトの名無しさん:04/10/19 19:57:04
copy_nは標準じゃない事に今気づきました
これに相当する処理をSTLのみで実現するにはどうやったら一番効率がいいですか
521デフォルトの名無しさん:04/10/19 20:00:44
copyを使ってcopy_nを実装する
522520:04/10/19 20:03:35
>>521
それはまぁそうなんですけど
もっといい方法はないのかなと
523デフォルトの名無しさん:04/10/19 20:26:57
>>522
521の案が1番良いと思うが。
524デフォルトの名無しさん:04/10/19 21:28:42
ttp://www.sgi.com/tech/stl/copy_n.html
Notes の [1] に
"Copy_n is almost, but not quite, redundant. If first is an input iterator, as opposed to a forward iterator, then the copy_n operation can't be expressed in terms of copy."
とある。

copyを使うと「 istream_iterator から3つ読み込む」などのケースでエラーになってしまう。
525デフォルトの名無しさん:04/10/19 21:51:42
既存のSTLアルゴリズムじゃ524さんが書いてるように代替が利かない場合がありますよね.
無ければ作れば良いだけなんでは?すぐに書けるでしょう.
526デフォルトの名無しさん:04/10/19 22:46:51
boost release branch クルー
527デフォルトの名無しさん:04/10/19 23:33:08
copy_ifについてBjarneが言っているのと同じように、
copy_nも自分で書くのが一番いいのではないかと。
528デフォルトの名無しさん:04/10/20 01:12:17
どのみち自分で書くのかよ
まあここはSTLの範疇になかった悲しい例ってことでお茶を濁すのが正解だね!
529デフォルトの名無しさん:04/10/20 10:01:50
C++ってこういうのがmethodじゃなくて、
generic functionになっているのが良いところだから、
どんどん標準に入れちゃえばいいと思うんだけど…

methodだと流石に躊躇するけどね。
530デフォルトの名無しさん:04/10/20 11:57:24
>524を踏まえてiterator_categoryでdistanceでは実装切り替えを行ってるのに
なぜにcopy_nを取り入れてやらないかね。変な所で頭固い?
531デフォルトの名無しさん:04/10/20 21:55:52
そりゃcopy_ifやcopy_nくらいは自分で実装はできるけどさ・・
そんな事いったらコンテナだってそうだし

標準である事に意味があるのにね
532デフォルトの名無しさん:04/10/21 02:03:07
とりあえず動く程度なら誰でも実装できるが、
他人に使ってもらえるようなライブラリを書くには
相当の知識と経験が必要
533デフォルトの名無しさん:04/10/21 04:34:20
copy_nですら一工夫要りますしね.
534デフォルトの名無しさん:04/10/21 10:30:13
template<class I, class O>
void copy_n(I InIt, size_t n, O OutIt)
{
 while (n--) {
  *OutIt = *InIt;
  ++OutIt;
  ++InIt;
 }
}

一工夫って、単純に上のように書いただけじゃあだめなの?
535デフォルトの名無しさん:04/10/21 13:02:19
OutItがn個進む前に終わっちゃったとき例外投げるとか
536デフォルトの名無しさん:04/10/21 13:04:42
>>534
そんな遅い実装されたライブラリを誰がつかいたがる?
537デフォルトの名無しさん:04/10/21 15:19:27
>>536
もっといい方法があるのか?
538デフォルトの名無しさん:04/10/21 15:52:21
STLPortの実装見て思いましたが,524のような状況がcopy_nの存在意義だとすると
copy_nって終了後の入力イテレータ返さないとまずいですよね?
(STLPortの実装では返り値が入力イテレータと出力イテレータのペアになってる)
標準に入らなかったのはここら辺でもめたからではないでしょうか?

>535
OutputIteratorには「終わり」を判別する方法がまったくないです.

>536
ディスパッチするべきだという指摘ですよね?
539デフォルトの名無しさん:04/10/21 20:15:11
n進む前にOutItが終わりに達するときの動作は「未定義」ってことにすればいいじゃん。
540デフォルトの名無しさん:04/10/22 00:30:03
C++に多値があればねえ。
541デフォルトの名無しさん:04/10/22 00:47:58
>534
これって例外安全じゃないよね?
真面目にやるならSwap関数が必要になるんじゃない?
542デフォルトの名無しさん:04/10/22 00:58:20
複数の動作をまとめて行う関数を直接例外安全にするのは無理
543デフォルトの名無しさん:04/10/22 01:59:45
>541
コピーされる型の代入演算子を呼ぶ以上、nothrow guarantee は無理なのでは。
また、strong guarantee のためにはコピー先のイテレータがバイディレクショナルである必要があるから
現状の basic guarantee のみを満たしている状態が妥当なんだと思います。
多分ですけど。
544デフォルトの名無しさん:04/10/22 02:00:16
mutating algorithmにstrong guaranteeを求めるのは非常に高コストになるので,
普通は要求するべきではないでしょう.標準でもこれに関しては要求してません.
唯一の例外はuninitialized系だけです.
545デフォルトの名無しさん:04/10/22 02:01:46
なんでこんなレスがかぶるんだYO!ヽ(`Д´)ノ
546デフォルトの名無しさん:04/10/22 02:05:00
ケコーンしろ、リアルで
547デフォルトの名無しさん:04/10/22 02:08:01
>>543
式の日取りはいつが良いですか?
・・・じゃなくて,bidirectionalはstrongの要求としては強すぎませんか?
forward(multipass)で良いと思うのですが・・・.どちらにしろ高コストですけれど.
548541:04/10/22 02:20:05
そりゃそうだな。そもそもイテレータだけじゃSwapできねえか……でも

  *OutIt = *InIt; 
  ++OutIt; 
  ++InIt; 

全部例外投げる可能性があるのもなぁ
549543:04/10/22 02:22:48
>547
あ、そうですね。思い切り勘違いしてました。
式は、まあ、考えておきます・・・。
550デフォルトの名無しさん:04/10/22 21:56:23
漏れなんて300行以上のプログラムなんて書いたことがない
551542:04/10/23 01:48:17
でもcopy_nなんてのを使うのは例外のことは考えなくて
いい場面なのかもな
552デフォルトの名無しさん:04/10/23 01:57:35
>>541
Swapがあれば例外安全なcopy(first,last,result)が実装できるの?
553デフォルトの名無しさん:04/10/23 02:27:01
ExcptionalC++になんか載ってたな
554デフォルトの名無しさん:04/10/23 07:34:40
>>552
例外安全なSwapがあれば・・・という話だ
555デフォルトの名無しさん:04/10/23 08:13:38
>>552
例外安全なSwapがあれば・・・という話だ
556デフォルトの名無しさん:04/10/23 08:35:22
swapがあろうとなかろうとクライアントまかせ!!
557デフォルトの名無しさん:04/10/23 09:38:26
>>554
swap があってもダメでしょ。forward iterator だと、そもそも「二回読み出せない」
なんつーのもありえる(標準入力とか)から、最初の要素をコピーした直後に例外
が発生すると、どのみち元には戻らない。
558554:04/10/23 11:50:44
>>557
そーだね。

552に対して
×Swapが存在すればいい
○例外安全なSwapの存在の前提としてケースによっては...
と答えたってことでよろ
559デフォルトの名無しさん:04/10/23 13:32:41
×例外安全なSwapの存在の前提としてケースによっては...
○例外安全なSwapの存在を前提として、ケースによっては...

560デフォルトの名無しさん:04/10/23 14:23:55
こんなくだらないことで盛り上がってるとはさすが
561デフォルトの名無しさん:04/10/23 15:20:00
自分でもイマイチtemplateが分かってないような気がするのですが、

template<typename T, typename R, class GV> R total(T* t, int n, GV getValue)
{
 R ret;
 for(int i=0; i<n; ++i)
 {
  ret += getValue(t[i]);  
 }
 return ret;
}

class Person
{
 int age_;
pubic:
 Person() : { age_ = rand() % 80; }
 int getAge() const { return age_; }
};

main()
{
 Person ps[50]; 
 cout << total(ps, 50, std::mem_fun(&Person::getAge) << endl;
}

これが通って希望通りの動作をするようにするにはどう変更すればいいでしょうか?
自分でtemplateを書いて使う勉強をしてるので、accumulateを使えとかそういうのはいいです。
562デフォルトの名無しさん:04/10/23 15:27:41
>>561
コンパイルして、文句言われる部分を凝視するのがいいかと
563デフォルトの名無しさん:04/10/23 15:35:29
>>562
ありがとうございます。
とりあえずtypoとか余計なコロンを直して、
total(ps, 50, std::mem_fun(&Person::getAge)でしかエラーが出ないようにしましたが、
解決したい事の本質は、
getValueがRを返す事をどうやってtemplateで教えてあげればいいのか?
戻り値があるとmem_funが通らないような気がするのはどうすれば解決できるのか?
の2点だと思います。

一応typo直して残ったエラーメッセージはこれです。
error: no match for 'operator<<' in 'std::mem_fun(_Ret (_Tp::*)()
const)
[with _Ret = int, _Tp = Person]() << std::endl'
error: 構文解析エラー before `;' token
564デフォルトの名無しさん:04/10/23 15:49:00
まず
mem_fun→mem_fun_ref

それから
template<typename T, typename R, class GV>
R total(T* t, int n, GV getValue);
としてるが、R型の引数がないので型推論が出来ない上、内部で取ってる
retという変数が初期化されていない。
R&型の引数をとるようにしてmain内の一時変数をそれに与えろ。
565デフォルトの名無しさん:04/10/23 16:06:47
>>564
その通りにやったらできました。
accumulateになんで初期値を渡さないといけないのか分かった気がします。
566デフォルトの名無しさん:04/10/23 16:14:57
たまには真面目に答えてみようと努力する。
と書いている間に解決してるっぽいorz。

まず返り値Rを教えてあげる方法だけど、
<functional>で定義されている1引数の関数オブジェクトは全部構造体unary_functionを継承しているから、
GV::result_typeで返り値の型は取得できる(でも面倒なのでこれ以降はRと略す)。
もしtotal関数に生のポインタを渡したくなったら、std::ptr_funを使う必要がでてくるけどね。

だから、この場合、関数宣言はこんな感じになる。
template<typename T, typename R, class GV> typename GV::result_type total(T* t, int n, GV getValue)

mem_funについては、mem_fun(R (T::*f))で作られた関数オブジェクトFに、
T*型の変数pを渡してF(p)のように呼び出すときに使う。
この場合だと、t[i]の型はT型(T&型)だから、mem_fun_refを使う必要があるわけ。

>>564 の人も言っているけど、retの値は初期化しないとだめ。
そのためには、total関数に新しく引数 R& ref を作って呼び出し側に渡してもらうか、
あるいはboostというライブラリのvalue_initializedという小道具を使うか。
ttp://www.kmonos.net/alang/boost/classes/value_init.html

さらに難癖をつけるなら、せっかく型Tをテンプレート引数としてとっているのだから、
total内のforループの部分はもっとSTLのイテレータを意識した書き方をするべき。
R total(T t, int n, GV getValue) のように引数を宣言して、
while(n--)
 ret += getValue(t++);
のようにすれば、totalの第一引数にvectorやlistのイテレータだって渡せるようになる。勿論、Person型への配列も。
この場合、mem_fun_refじゃなくてmem_funを使う必要があるね。
もしこのmem_fun周りの使い分けが面倒だと思ったら、boostのmem_fnを使ってみるといい。
ttp://www.kmonos.net/alang/boost/classes/mem_fn.html
ttp://boost.cppll.jp/HEAD/libs/bind/mem_fn.html
567デフォルトの名無しさん:04/10/23 16:17:52
>566 訂正。第3段落2行目を
template<typename T, class GV> typename GV::result_type total(T* t, int n, GV getValue)
に訂正してくださいです……。

あと第5段落5行目はret = getValue(*(t++))にしてください。
これだとmem_funを使う事になるのかな?
568564:04/10/23 16:45:14
あと
total(T* t, int n, GV getValue,~
じゃなく
total(IT begin, IT end, GV getValue,~
なんて標準ぽい書き方にしといたほうがいいな
569デフォルトの名無しさん:04/10/23 17:42:01
それまんまaccumulateやん、っていうw
templateの勉強なら各実装のSTL読むのも一興。
570552:04/10/23 20:15:30
>>554
Swapをどうやったらcopyを例外安全にできるのか、未だにわからないんだけど、
コード書いてみてもらえる?
571デフォルトの名無しさん:04/10/23 20:16:13
s/Swapをどうやったら/Swapをどう使ったら/
572デフォルトの名無しさん:04/10/23 20:26:40
swap を使おうが、nothrow は無理。
copy-constructor と nothrow-swap を用いることで
copy-assignment に strong guarantee を与えるという話。

コードはこんな感じ
T& T::operator = (const T& t)
{
T(t).swap(*this);
return *this;
}
573デフォルトの名無しさん:04/10/23 20:34:41
>>572
それは代入演算子の実装。
copyに>>534以上の例外安全性を持たせることができるのかって話。
574572:04/10/23 20:35:48
ただしこれは一つの要素のコピーの話で、
コピーを複数回するとなると strong guarantee を保障するのはより面倒。
どう面倒なのかは上の方を参照のこと。
575572:04/10/23 20:41:12
>573
copy の仕様?を変えない限り無理。
出力先のイテレータに ForwardIterator であることを要求し、
かつコストを無視してもよければ、まあできるんじゃない。
576デフォルトの名無しさん:04/10/23 20:41:49
つまり、 >541,>554,>558 は妄言ってことでいいの?
577デフォルトの名無しさん:04/10/23 21:01:16
>>576
良いでしょ。ま、誰にも勘違いはあるってことで、あまり苛めずに
スルーするのが人情かと。
578デフォルトの名無しさん:04/10/23 21:19:56
ここでやっと終止符を打つのか。
約577-520の久々の長スレ
乙。
579デフォルトの名無しさん:04/10/23 21:22:48
test
580デフォルトの名無しさん:04/10/23 21:31:12
boostって開発の初期段階では確かに加速してくれるけど、
プロジェクトが長くなればなるほど重しになっていくような気がする
581デフォルトの名無しさん:04/10/23 21:33:43
>>580
boostのどのへん?
582541!=542==554==558:04/10/23 22:30:47
>>577
ケースによっては...
ってちゃんと言ってるぞ!
しかも542にも学生注目
583デフォルトの名無しさん:04/10/23 23:12:55
>>582
スルーしてやろうってのに、妄言追加してどうするよ。
584577:04/10/23 23:46:44
>>582 >>583
やっぱり苛めて良いや。
585デフォルトの名無しさん:04/10/24 00:32:00
詩ね
586デフォルトの名無しさん:04/10/24 00:45:50
うーん...
swap関数と例外安全性と複数回コピーとの関連が複雑でわけわからん
ことになってしまいました。
ケースによっては、とか更に理解困難です。
587デフォルトの名無しさん:04/10/24 01:20:04
コピーを巻き戻すためには追加の記憶域(バックアップみたいなの)が必要。
イテレータによる範囲コピーなら、範囲の長さに応じた(動的な)容量が必要になる。
strong guarantee を提供するためにはこの領域を copy 関数内部で取る必要があるが、
その負荷は標準アルゴリズムとしては受け入れられないだろう。

>>586
妄言を理解しようなんて無理だから安心しる。
588デフォルトの名無しさん:04/10/24 01:36:27
>587
さらに付け加えて失敗時のロールバックで例外が投げられるという最悪の事態も想定されると思うですがどうでしょうか?
589デフォルトの名無しさん:04/10/24 01:37:50
>>588
失敗時のロールバックに nothrow swap が必要になるんだろ。
590デフォルトの名無しさん:04/10/24 01:50:11
新たに例外が起こる可能性があるのはバックアップを取るときですね。
まあ、例外安全性は確保されてますが。
591588:04/10/24 01:55:04
>589
>590
イテレータのみを知ってる状態ではそれが不可能な場合が有り得るように思えるのですがどうでしょうか?
そのような操作にはno throwなswapが可能なSappable Iteratorであることが要求されるように思うのですが…
(そしてこのような要求は例えばvectorのイテレータでは達成出来ないように思います)
592デフォルトの名無しさん:04/10/24 02:16:19
>591
要するに、>575 の条件プラス nothrow swap が必要となるわけか。
nothrow swap が加わるのは厳しいな。
593588:04/10/24 02:39:09
すいません.591の「nothrow swapg必要」ということ以外はただの思い違いです.
無視してやってください.混乱させて本当にすいません.
589, 590さんのおっしゃる通りです.

>592
nothrow swapは例外安全のための最も基本的な要素なので
「厳しい」というのはどうかと思います.
594586:04/10/24 08:21:53
うーん、

『nothrow swapの存在が前提で、なおかつバックアップを
とるなどの負荷を受け入れられるケースでは、』例外安全にできる(かも)、

って単純に理解しとけばいいですか?
595デフォルトの名無しさん:04/10/24 09:06:47
// strong_copy: Copy range with strong guarantee
#include <vector>
#include <algorithm>
#include <iterator>

template< typename InputIterator , typename ForwardIterator >
ForwardIterator strong_copy( InputIterator first , InputIterator last , ForwardIterator result )
{
  typedef typename std::iterator_traits< ForwardIterator >::value_type value_type;
  std::vector< value_type > backup;
  ForwardIterator const result_first = result;
  try
  {
    while( first != last )
    {
      backup.push_back( *result );
      *result = *first;
      ++result;
      ++first;
    }
    return result;
  }
  catch( ... )
  {
    std::swap_ranges( backup.begin() , backup.end() , result_first );
    throw;
  }
}
// ・入力も ForwardIterator に狭めれば backup に reserve をかけることができる
// ・reserve できないなら、 backup は vector よりも list,deque のほうがいいかも
596デフォルトの名無しさん:04/10/24 10:00:52
std::copy(first, first+n, dst) ではいけない訳を50時以内で記述せよ
597デフォルトの名無しさん:04/10/24 10:19:38
>>596
50時以内ってのと、誰がそれではいけないと言ったのかがよくわらんが、
first+n は RandomAccessIterator でしか使えないからじゃないか?
598デフォルトの名無しさん:04/10/24 10:21:15
>>594
それじゃ妄言と同じだぞ。もっとよく考えろ
599デフォルトの名無しさん:04/10/24 10:30:42
std::copy(first, std::advance(first, n), dst)
600デフォルトの名無しさん:04/10/24 10:34:14
ごめん、成功時にnothrow swap を使うんだと想定してた。
俺だけか?
こんなふうに。

template< typename InputIterator , typename ForwardIterator >
ForwardIterator strong_copy( InputIterator first , InputIterator last , ForwardIterator result )
{
typedef typename std::iterator_traits< ForwardIterator >::value_type value_type;
std::vector< value_type > backup;
ForwardIterator const result_first = result;
try
{
while( first != last )
{
backup.push_back( *first );
++result;
++first;
}
std::swap_ranges( backup.begin() , backup.end() , result_first );
return result;
}
catch( ... )
{
throw;
}
}
601デフォルトの名無しさん:04/10/24 10:34:58
>>595
それでも STL で定められている入力イテレータ・前方イテレータのコンセプトを
前提とする限り strong guarantee は得られない。

*result = *first;

ここでイテレータを介した読み書きが副作用を伴う(たとえば *result = 1 と
すると標準出力に 1 と表示されるようなイテレータとか)だとアウト。また
入力イテレータは二回以上読み出せることを保証してない。

単なる入力イテレータ・前方イテレータではなく、より制約のきついコンセプトを
決める必要がある。
602デフォルトの名無しさん:04/10/24 10:43:59
>>600
600ゲットしてるぞ。ちなみに俺もそう思ってた。
Exceptional C++に載ってる標準例外安全規則によると、

『例外を投げる可能性のあるコードをすべて取り出し、別の場所で
安全に処理すること。その後、本来の処理の成功を確認した時点で、
例外を投げない処理だけを使ってプログラムの状態の変更を行う』

とあるので、成功時にnothrow swap を使うというのはまさにその通り
だと思う。
603デフォルトの名無しさん:04/10/24 10:46:03
>>600
その考えならコードはこれで十分だろう。

template< typename InputIterator , typename ForwardIterator >
ForwardIterator strong_copy( InputIterator first , InputIterator last , ForwardIterator result )
{
  typedef typename std::iterator_traits< ForwardIterator >::value_type value_type;
  std::vector< value_type > backup( first , last );
  return std::swap_ranges( backup.begin() , backup.end() , result );
}

result に対して operator= を使わないことになるが、
swap_ranges を使う限り、要求としては >>595 と同じものになるだろう。
604デフォルトの名無しさん:04/10/24 10:55:03
>>601
result にはtemplate仮引数名で ForwardIterator を要求しているから、
標準出力に出るようなイテレータはそもそも対象外。
また、>>595のコードでは入力からは一回しか読んでいない。

問題があるとすれば、 ForwardIterator の制約が
swap_ranges に渡せるイテレータとして十分かどうか、だろう。
605デフォルトの名無しさん:04/10/24 10:59:38
>>604
> また、>>595のコードでは入力からは一回しか読んでいない。
例外発生時に [fist, last) から二度と読み出せないので、情報が失われて
しまう。
606デフォルトの名無しさん:04/10/24 11:03:28
失敗したら元に戻す、っていうのと成功が保証された時点で
書き込みを実行するのとじゃ安心度が違うような気がするんだが。
607デフォルトの名無しさん:04/10/24 11:13:25
>>605
> 例外発生時に [fist, last) から二度と読み出せないので

あーそうか。
そうなると、入力も ForwardIterator にしとかないと、
strong guarantee とは言えないな。

ってことは、 uninitialized_copy も同じ問題を持ってるな。
↓で strong guarantee を持つ操作として挙げられてるのは不適当ってことになる?
http://www.stlport.org/doc/exception_safety.html
608デフォルトの名無しさん:04/10/24 11:41:48
>>604
ForwardIterator x に対する *x は value_type& を返すことを要求されるので swap の引数とすることができる。
この制約があれば swap_ranges に対して ForwardIterator は適格といえる、たぶん。
609デフォルトの名無しさん:04/10/24 12:22:38
>>599 advance の戻り値は void ですよ。
610デフォルトの名無しさん:04/10/25 00:26:59
>607
隊長っ!!こんなものを発見しますたっ!!
http://tinyurl.com/46plq
611デフォルトの名無しさん:04/10/25 01:55:15
>>610
結構な文量だな。

要約すると、
標準入力がエラーで巻き戻せないのは標準出力の仕様で、
そんなもんを扱ってる限り、 strong guarantee なんて無理無理無理無理
だから STL の例外安全性を語るときにはそんなもんアウトオブ眼中じゃ
って感じ?
612デフォルトの名無しさん:04/10/25 01:58:48
s/標準出力/標準入力/
613デフォルトの名無しさん:04/10/25 03:07:29
というかどうもDavid Abrahamsの言う"Strong Guarantee"は
ユーザが与えた型(イテレータ含む)の副作用の面倒までは見ない,
ということみたいですね.

> *to understand that guarantee correctly, you must realize that side-effects
> of user-supplied types (including iterators) are not covered.

「istream_iteratorのincrementによる入力の消費」も
当然Strong Guaranteeが面倒を見ないside-effectということになるんでしょう.
そりゃ確かにそんなもの面倒見切れるはずないですけれど・・・.
個人的にすごい違和感を感じます・・・.
614デフォルトの名無しさん:04/10/25 03:47:17
結局何がいけないのかというと,「Input Iterator Concept」を
安易に「istream_iterator」に結び付けてしまうのがいけないんでしょう.
「istream_iteratorをstrong_copyに渡して例外が飛んだら入力が失われるから
Strong Guaranteeじゃねぇぞヽ(*`Д´)ノゴルァ」と文句を言うのは,
「あるグローバル変数をincrementする特殊なInput Iteratorを
strong_copyに渡して例外が飛んだらその変数が変化したままだから
Strong Guaranteeじゃねぇぞヽ(*`Д´)ノゴルァ」と文句を付けるのと
全く同等だ,ってことなんでしょう.(後者がナンセンスなのは明白でしょう)
ユーザが任意に設定し得る副作用の巻き戻しまで面倒を見切れるはずがない.
だからStrong Guaranteeの定義で,副作用の面倒は見ない,とした.
要するに結論はstrong_copyはInput Iteratorを入力に取れる,ですね.
・・・でもやっぱり納得できねぇ!
615デフォルトの名無しさん:04/10/25 04:11:11
s/任意に設定し得る副作用/型パラメータを通して任意に設定し得る副作用/
616デフォルトの名無しさん:04/10/25 08:02:18
入力を安全な形でプールした後で、strong_guaranteeな処理を行えばいい。

>>614が納得するかしないかはどうでもいい。
規格としてしごくまっとうだし、使う側として問題ない。
617デフォルトの名無しさん:04/10/25 08:48:53
そこでmonadですよ
618デフォルトの名無しさん:04/10/25 20:03:42
Templateって一言で言って何ができるようになるの?
興味はあるんだが、今一実態がつかめん。
619デフォルトの名無しさん:04/10/25 20:36:50
怠け者になれる。
620デフォルトの名無しさん:04/10/25 20:49:16
>>618
テンプレの使い方テクの正体が分らないなら、一旦Haskellやってみたら?
C++のテンプレの使い方はかなり変則的だけど、その元ネタはあっちから来てるケースが多いんで
向こうの方が本質が見えやすいから。
621デフォルトの名無しさん:04/10/25 21:28:14
>>618
型安全なマクロ

最適化を阻害せず、型安全かつ型に依存しない汎用関数プログラミングができる。
その辺を突き詰めてくと関数型プログラミングみたいなのもできるわけだけど、
C++の構文の上にテンプレート独自の構文、セマンティクスが混ざり合って
不思議な世界が拓けてくるわけだが、やりすぎると職場の誰もフォローできない
メンテ不可なゴミコードができる。
構造化プログラミングのグローバル変数とかgotoとか一関数10000行のプログラム
なんかと、一緒。

本質なんかどうでもいいから、STLとかboostとかに触れてみれば面白いんで無いかい?
622デフォルトの名無しさん:04/10/25 22:00:57
>>621
> 型安全なマクロ

再帰も加えといて。
// cppのマクロはm4と違って再帰展開がダメ。
623デフォルトの名無しさん:04/10/25 23:38:50
>>621
使い方がとてつもなく寒いな、べつにいいけど
624デフォルトの名無しさん:04/10/26 07:16:07
http://www.boost.org/
Coming soon - Version 1.32.0
625デフォルトの名無しさん:04/10/26 10:22:51
>>624
おおおそうか。楽しみだ。
626デフォルトの名無しさん:04/10/26 13:33:18
キターage
627デフォルトの名無しさん:04/10/26 15:21:32
何が変わるの?
628デフォルトの名無しさん:04/10/26 15:37:26
主要な変更・追加はReleaseされたらwebに載るから気長に待つよろし
629デフォルトの名無しさん:04/10/26 15:40:11
カミング・ヌーン
630デフォルトの名無しさん:04/10/26 19:32:55
631デフォルトの名無しさん:04/10/26 21:27:25
>>630
シリアライズ キター━━(゜∀゜)━━!!
632デフォルトの名無しさん:04/10/26 21:54:00
>出力形式にはテキストファイル、バイナリファイル、XMLファイルが選べ
ファイルになってるけどstringとして吐いたりstreamに吐いたりは出来ないの?
633>>630の記事書いた人:04/10/26 22:05:29
>632
できます。書き方が悪かったですね。
出力先は任意のストリームです。
634デフォルトの名無しさん:04/10/26 23:08:59
感動した。


マジ感動した。
635デフォルトの名無しさん:04/10/26 23:52:21
お前みたいな奴はうちの子じゃない!
636デフォルトの名無しさん:04/10/27 00:17:01
(@益@ .:;) なんだと
637デフォルトの名無しさん:04/10/27 00:43:25
キタキタキタ━━━━━━(゚∀゚)━━━━━━ !!
キタキタおやじ。(゚д゚)ウマー。
638デフォルトの名無しさん:04/10/27 03:07:30
ではここでグーグル先生の検索ヒット時のように

 Boooooooooost!
639デフォルトの名無しさん:04/10/27 07:37:08
Assignment, Serialization, String Algorithms
の3つでもう(*´д`*)ハァハァ
640デフォルトの名無しさん:04/10/27 09:01:27
子供の頃、期待の新作ゲームのシステムが発表されたときの
あのワクワク感を久しぶりに味わった
641デフォルトの名無しさん:04/10/27 14:15:39
STL初心者ですが、重複を許す双方向リストというか
グラフ図やネットワーク図のような
多対多で経路数も異なるリストを作りたいのですが
multimup系(stlport::hash_multimap)にしてValueに
prevとnextのitelatorをstd::listで持つ
という設計しか浮かばないのですが
良い方法教えて下さい
642デフォルトの名無しさん:04/10/27 14:37:10
そんな貴方にboost::graph
643デフォルトの名無しさん:04/10/27 14:37:22
>>641
どうやって使うかを書かないと回答のしようが無いと思いますが、
とりあえず boost::graph ではいかがでしょうか?
644641:04/10/27 19:38:21
ありがとうございます。boostもインストールしてみました。
マルコフ連鎖を作りたいのです。しかも複数連鎖で最長Hitを基本に。
人工無脳のようなものをCで作りたいといえば良いでしょうか。
645デフォルトの名無しさん:04/10/27 19:49:45
今週末にまたインストールするはめになる>>641なのでした
646デフォルトの名無しさん:04/10/28 00:03:25
STLのランダムアクセスイテレータ i があって
i += hogehoge;
としたあとの i が有効かどうかは
begein() <= i < end()
と判断してOKですよね?
647646:04/10/28 00:04:14
C++スレと間違えたけどました。
でもまあお願いします。
648デフォルトの名無しさん:04/10/28 00:16:14
>>646
ランダムアクセスイテレータならばbegin()に直せば
begin() <= i && i < end()でよい。
649デフォルトの名無しさん:04/10/28 01:47:21
>>648
ありがとうございます。
そもそも比較演算子が定義されているということは、と考えれば当然だと思いましたが
自信が無かったもので。
650デフォルトの名無しさん:04/10/28 14:19:09
JAVAのBreakIteratorみたいなのないのですか?
行単位で操作とかしたいんですが
651デフォルトの名無しさん:04/10/28 15:42:00
boost::tokenizerとか使ってみたら?
652デフォルトの名無しさん:04/10/28 15:49:33
あとboost1.32.0から登場のstring_algoのsplitにも乞うご期待.
653デフォルトの名無しさん:04/10/28 16:40:36
>>646-649
範囲外のイテレータの比較ってokだっけ?
i += hogehoge;する前に、
begin() - i <= hogehoge && hogehoge < end() - i
とした方がいいんじゃないだろうか。
654646:04/10/28 18:15:55
理由はわかりませんが
プログラミング言語C++第3版(p.646)のChecked_iterではそのようになっていました。
より安全そうな事前チェックにしておきます。
655デフォルトの名無しさん:04/10/28 20:52:15
すまんせん、STLはじめたばっかでこんらがらっております
stlport::hash_multimapを使って複数Hitしたらその中からRandomで
一つのItemを取り出したいと思って 手始めにrandom_shuffle()
を使おうとしたのですがコンパイラにはじかれます
hash_multimapはランダムアクセス不可なんですか?
また、上記の要望を満たす良い方法は無いですか?
おながいします。

typedef stlport::hash_multimap<int,int> MM;
MM h;
stlport::pair<int,int> p;
stlport::pair< MM::iterator, MM::iterator > r;
r = h.equal_range(1);
stlport::random_shuffle( r.first, r.second );
656デフォルトの名無しさん:04/10/28 21:23:29
>>653
> 範囲外のイテレータの比較ってokだっけ?
いや、駄目。
ランダムアクセスイテレータの一種であるポインタがまず駄目だし。
657デフォルトの名無しさん:04/10/28 21:31:27
http://www.tv-asahi.co.jp/iq/
↑これの左下の問題ってさあ

template<class T, class Operator, size_t size>
class 魔方陣;

としたときの
魔方陣<Shape, XOR, 3>;
だよな?
658デフォルトの名無しさん:04/10/28 22:16:17
>>656
ポインタが範囲外になってもアクセスさえしなければ問題ないのでは?
int *a = new int[10];
cout << a - 10;
これも未定義なのですか?
659デフォルトの名無しさん:04/10/28 22:25:52
>>658
そういう意味じゃなくて、不等式の結果の問題。
ISO/IEC 9899:1999 6.5.8 Relational operators参照。
660デフォルトの名無しさん:04/10/28 22:26:42
>>658
未定義
661デフォルトの名無しさん:04/10/28 22:56:17
>>658
アドレス参照が許されるのは、その場合だと a から a + 10 まで。それ以外は
未定義。

現実にはまずないと思うが、仮に a がアドレス 40 番地とかに割り当てられて
たらa - 10 が NULL と一致する可能性もあるわけで。
662658:04/10/28 23:10:38
おぉぉ勉強になります。
663658:04/10/28 23:49:07
>>659
JIS X3010:2003(これはC99かな)しか確認できていませんがたしかに未定義と書かれていました。
JIS X3014は17000円もするのか。図書館行ってきまつ。
664デフォルトの名無しさん:04/10/29 00:29:21
665デフォルトの名無しさん:04/10/29 00:34:23
666デフォルトの名無しさん:04/10/29 01:50:08
>>655
> hash_multimapはランダムアクセス不可なんですか?
はい。

> また、上記の要望を満たす良い方法は無いですか?

  int const num_equals = std::distance( range.first , range.second );
  if( num_equals > 0 )
  {
    double const rand_0to1 = std::rand() / ( RAND_MAX + 1.0 );
    iterator i = range.first;
    std::advance( i , static_cast< int >( num_equals * rand_0to1 ) );
    return i->second;
  }
667デフォルトの名無しさん:04/10/29 22:13:31
>>657
例題の一番左のやつか?
惜しいけど斜めが成り立ってないから魔法陣とはいえない
縦横だけならXORでゼロになってる

地下鉄の吊広告にもなってたね
668デフォルトの名無しさん:04/10/30 13:50:38
>>661

俺、a - 10 どころか a - 1 でアンダーフローしたことがあるよ。
16bit 時代の話だが。
large model 使ってると、それなりに良く起こるんだ、これが。

今でも double v[10][100000]; なんて変数を使ってると、
一応起きうる話。C++ だと、そんなことはほとんどしないとは
思うが、数値計算系だと、可能性としてはあるかもしれない。
669デフォルトの名無しさん:04/10/30 14:27:01
1.32に合わせてboost使い始めようかと勉強中。
読めば読むほど俺に使えるか自信が・・・orz
670デフォルトの名無しさん:04/10/30 15:20:40
>669
簡単なところから使い始めればいい。
今月のCマガを買うなり、稲葉一浩のBoost本を買うなり、
Webで検索するなりしてみ。

Boostはいくつかのライブラリの集まりだから、全部使いこなす必要はまったくないわけで。
671デフォルトの名無しさん:04/10/30 20:09:02
Boost.Preprocessor勉強中

プリプロセッサに関する既知の問題

問題 #3
「私はcppを廃止してしまいたい。」 - Bjarne Stroustrup in [Stroustrup]。

解決法
C/C++ プリプロセッサは末永く存続する。

思わず爆笑しちまったよ
672デフォルトの名無しさん:04/10/30 23:00:59
boostのいう週末とはいつのことですか?
673デフォルトの名無しさん:04/10/30 23:03:16
終末ですよ?
674デフォルトの名無しさん:04/10/31 00:21:32
CVSから持ってきたのはドキュメントは1.32だけど、これ大丈夫なのかしら。
675デフォルトの名無しさん:04/10/31 00:38:57
直前で差し替えとか良くあるけど大丈夫だよ
676デフォルトの名無しさん:04/10/31 03:58:20
VC7.1 with STLPort 5.0でboost最新版をコンパイルしようと思ったんですが。
lexical_cast のところでこけます。
error C2679: 二項演算子 '>>' : 型 'boost::date_time::date_names_put<Config,charT,OutputIterator>::string_type'の右オペランドを扱う演算子が見つかりません (または変換できません)。
STLPort無しだと通ります。
どなたかSTLPortで使うときのコツ知ってたら教えてください。
677デフォルトの名無しさん:04/10/31 04:30:55
Coming soon - Version 1.32.0

[October, 25] A long-awaited Boost release packed with new libraries,
features and bug fixes is expected to be released by the end of this week.

まだぁ?チン!チン!
678デフォルトの名無しさん:04/10/31 04:34:41
もう新しい週に入っちゃってますが
679デフォルトの名無しさん:04/10/31 05:50:53
そして週末になってインスコしたばかりのBoostを再インストールしようと
boost.orgに常駐している>>641であった orz
680デフォルトの名無しさん:04/10/31 07:28:52
>>676
確かどっか書き換えなきゃいけなかったはず
681デフォルトの名無しさん:04/10/31 08:37:25
>>678
タイムゾーンが JST じゃないんだよ、きっと。
682デフォルトの名無しさん:04/10/31 08:40:25
日曜日ってまだ週末だよ?
683デフォルトの名無しさん:04/10/31 09:28:20
カレンダーは日曜始まりのが多いけど、風潮としては週末というのは
日曜も含むっぽいね。
684デフォルトの名無しさん:04/10/31 10:27:13
いや,正直あれの期限予告には期待せずに気長に待ったほうが・・・
何度"this weekend"っていう言葉にぬか喜びしたことか・・・
685デフォルトの名無しさん:04/10/31 10:52:08
>>683
むしろカレンダーが特殊(由来はどこだろう?)なだけで、キリスト教的には日曜は当たり前に週末だし。
最近は週休二日制が普通だから今のカレンダーの表記だと土日が分離しちゃって分かりにくいよね。
686デフォルトの名無しさん:04/10/31 11:13:39
国によって違います。
687デフォルトの名無しさん:04/10/31 11:22:20
snapshot使ったらええやん
688デフォルトの名無しさん:04/10/31 15:45:40
明らかなミスでコンパイル通らないところがいくつかあったけど。
このまま放流されちゃうのかな?
689デフォルトの名無しさん:04/10/31 15:53:18
自動テスト通らない物はリリースしないだろ
690デフォルトの名無しさん:04/11/01 13:03:37
template引数を置換するテンプレートを考えてみた

#include<iostream>
#include<typeinfo>
template <typename T> struct replace_holder{template <typename TYPE> struct replace;};

#define regist_replace_holder(base) \
template<typename T> struct replace_holder< base<T> > \
{ \
template <typename TYPE> struct replace \
{typedef base<TYPE> type;}; \
};
#define replace_temp_arg(from,arg) replace_holder< from >::replace<arg>::type

template <typename T> struct temp1{};
regist_replace_holder(temp1);

int main()
{std::cout << typeid( replace_temp_arg(temp1<int>,double) ).name() << std::endl;}
691デフォルトの名無しさん:04/11/01 13:33:54
コレクションを使いたいのですが
Keyに対してItemは沢山結び付けたいですが
multimupだと同じKeyに同じItemを追加できてしまう気がします
同じItemは重複させたくないのですがequal_range()して
foreachなりでItemを調べないと無理なんでしょうか・・
692デフォルトの名無しさん:04/11/01 13:40:06
イマイチ理解しかねるが、
std::map<Key, std::set<Item> >
ぐらいか?

なにを持って"同じItem"というのか知らんが。
693デフォルトの名無しさん:04/11/01 13:50:33
>>692
サンクス。こんなのに気がつかなかった漏れ・・・
吊ってきます orz
694デフォルトの名無しさん:04/11/01 14:56:37
>>690
Boost.PPとか使ってもっと多くの引数を受け取れるようにすると面白いかもね。
逆に引数は同じでテンプレートの方を差し替えるなんてのも。
具体的な使用方法は思い浮かばないけどw
695デフォルトの名無しさん:04/11/01 16:50:11
>>690
マクロは引数を複数取るtemplateと非常に相性悪いので,このままだと拡張性に乏しいでしょう.
あるいは構文が非常に汚くなるか.(これはBoost.PPを使っても同じかと思います)
regist_replace_holderの使い方など制約も多いですし.

Boost1.32.0から,mplのメタ関数クラスの構文が変更されていて,
このうちのlamda & applyがまさにtemplate引数の書き換えを行っているようなので,
これの実装を読み解けばTMPの範囲内で希望の機能が実現できるかも・・・です.

#include<iostream>
#include<typeinfo>
#include<boost/mpl/apply.hpp> // from Boost1.32.0
#include<boost/mpl/lambda.hpp> // from Boost1.32.0

template<class T> struct temp1{};

int main(){
using namespace boost::mpl;
std::cout << typeid( apply<temp1<_1>, int>::type ).name() << std::endl;
}
696デフォルトの名無しさん:04/11/01 17:15:47
>>690
変更してみたバージョン
template <typename T> struct replace_holder;

template<template<class>class base, class From>
struct replace_holder< base<From> >{
  template<class Arg>struct apply{
    typedef base<Arg> type; };
};
697デフォルトの名無しさん:04/11/01 20:24:38
あー,template template引数による特殊化を使って
template-nameとtemplate-argument-listに分解するんですか.これは面白い.
あとはBoost.PPの出番ですね.ちょっと作ってみようかな?
698デフォルトの名無しさん:04/11/01 20:48:23
DRAFT tarball キター
699697:04/11/01 22:28:13
デフォルト引数の扱いが難しい・・・.
rebind<std::vector<int>, std::string>::type
としたときに,vectorの2番目の引数(アロケータ)も一緒に書き換わって欲しいけれど
どうやれば良いのか分からない・・・.
700デフォルトの名無しさん:04/11/02 01:31:47
>>699
template<template<class, class>class base, class From>
struct replace_holder< base<From, std::allocator<From> > >{
template<class Arg>struct replace{
typedef base<Arg,std::allocator<Arg> > type; };
};
これじゃあかん?
701デフォルトの名無しさん:04/11/02 01:34:20
だせえ
702デフォルトの名無しさん:04/11/02 01:38:50
>>695
そのようなことはちょっとソース見たかぎりじゃ確認できなかったのですが。
apply0の仕様が替わったぐらい。
703デフォルトの名無しさん:04/11/02 01:56:57
>>695
lambdaもapplyも前からあったと思うが、どの辺が変わってるの?
704695=699:04/11/02 02:27:09
>>700
さすがにそれはadhoc過ぎて・・・.
デフォルト引数を考慮したgenericなrebindは無理なのかも・・・.

>>702
>>703
695については自分が先走りしていただけでした.本当にすいません.
「試しにやってみたら動いちゃった」程度のものを早とちりしたようです.
705デフォルトの名無しさん:04/11/02 02:43:47
boost::tokenizer でsepalateしてるんですが
文字が化けてしまいます
今はSJISですがWEB系のツールなのでEUC、JIS、UNICODE扱いたいです
最低でも SJISとEUCは扱いたいのだけど
馬鹿だからわかんないよ
教えて お兄ちゃん
706デフォルトの名無しさん:04/11/02 02:45:10
WEB系ならphpかjavaにしよう
707デフォルトの名無しさん:04/11/02 02:53:43
C++的には一旦wchar_tに変換して処理、再度適当なCharsetに変換して出力。
708704:04/11/02 03:17:50
>>702,703
何度もすいません.やはり695は可能なようです.
いずれにせよ公式のドキュメント待ちです.
http://www.mywikinet.com/mpl/mpl_1_32_changelog.html
709デフォルトの名無しさん:04/11/02 06:51:50
>705
ICU使って変換しる
710デフォルトの名無しさん:04/11/02 07:14:12
ICUを使うと一気に実行ファイルサイズが10倍に?!
711デフォルトの名無しさん:04/11/02 08:30:31
>>710
ライブラリによるだろ。
俺はバベルを使ってるが、ICUほどは増えない。
712デフォルトの名無しさん:04/11/02 09:00:35
>>711
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
713デフォルトの名無しさん:04/11/02 12:11:40
>>712
環kry
714702:04/11/02 12:23:34
>>708
ごめん。ばりばりラムダつかってるわ。
どうも、寝ぼけてたみたい。orz
715702:04/11/02 12:25:53
でもそうするとapplyとラムダをどっちを使うか迷うような気がするけど。
それとbindは・・・まぁ大丈夫か。
716703:04/11/02 23:59:38
>>708
いや、だからMPLのlambdaは昔っから使ってる(秀和のBoost本で知った
記憶がある)が・・・どっか変わったの?applyが自動的にlambda化を
行うようになった点てこと?

メタ関数クラスの構文変更は、0引数のヤツの特殊扱いが要らなくなっ
ただけじゃなかったけ。
717703:04/11/03 00:00:19
てかなんでageてるんだ俺。吊ってくる。
718デフォルトの名無しさん:04/11/03 02:27:34
vc7.1 STLport-4.6.1 boost1.31.0とboost1.32.0で試したのですが
signalsをシングルスレッド版のlibがつくられません。dllもマルチスレッド版しかつくられません。
bjamの引数は以下のとうおりです。
bjam "-sTOOLS=vc-7_1-stlport"
   "-sBUILD=debug release <runtime-link>static/dynamic"
   "--prefix=C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7"
   install
719708:04/11/03 03:45:41
>>716
すんません.超大ボケでした.おっしゃるとおりです.
メタ関数クラスでない普通のクラステンプレートのlambda式で,
placeholderを置き換えてくれる機能は以前のバージョンからありました.
720デフォルトの名無しさん:04/11/03 07:47:05
>718
<threading>single/multi
……だったと思う。
721690:04/11/03 18:06:10
とりあえずboost preprocessor版ができたんで
うpしときました。
変更点は
・apply_argのindexを0にした(楽したかった...)
・arg_sizeを追加
・apply_baseを追加
(Arg,From1,From2)(From0,Arg,From2)(From0,From1,Arg)を生成するのがえらい大変だった...orz

http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1076074304&res=24&fi=no
722デフォルトの名無しさん:04/11/04 00:04:37
boost::lambda::bind が VC7.1 で使えないことに今日気づいた・・・orz

コンパイラがいくら対応しててもIDEがフリーズしたら意味ねぇんだよ(▼д▼#)
723デフォルトの名無しさん:04/11/04 00:19:56
クソIDEだな
724デフォルトの名無しさん:04/11/04 00:51:34
boost::filesystem::path に wchar_t 版が無いのはなぜなんでしょうか・・・
boost::filesystem::basic_path< typename Char > を実装してくれみたいな
提案が10ヶ月以上前にメーリングリストに提案されていますが、
まだ実装されてないってことは却下なんですかね。

所詮やつらにとっては英語以外アウトオブ眼中ってことでしょうか。
725デフォルトの名無しさん:04/11/04 01:00:42
726デフォルトの名無しさん:04/11/04 01:08:33
最初の方しか読むきにならなかったけどようするに作者はアンチゲイツだと言う事か。
727デフォルトの名無しさん:04/11/04 01:10:14
>>722
インテリ切るか別のエディタ使わないとダメなんだよね。
728デフォルトの名無しさん:04/11/04 01:14:35
>>727
なるほど、テンプレートが入り組みすぎててリソース枯渇とか
そんなところか。
729デフォルトの名無しさん:04/11/04 01:25:17
>>724
こんな未熟なライブラリがboostに入ってるほうが不思議。
730デフォルトの名無しさん:04/11/04 01:32:35
コネか?
731デフォルトの名無しさん:04/11/04 01:35:24
TESTING
-------

To run regression tests on the archives, you need to:

1) Grab the archive for your platform from one of the above locations.
2) Grab the latest "regression.py" from
http://www.meta-comm.com/engineering/boost/regression.py

3) Put the archive and "regression.py" in the same directory and invoke
the latter with the following command line:

python regression.py --local=<archive name> --runner=<your runner id>
--toolsets=<your toolsets> [<more options as needed>]

For example,

python regression.py --local=boost_1_32_0.zip --runner=metacomm
--toolsets=msvc,vc7,vc-7_1,cw-8_3 --pjl-toolset=vc-7_1


The results will be automatically uploaded to
ftp://fx.meta-comm.com/boost-regression/boost_1_32_0/.

こういうのに日本人がもっと協力してればもう少し考えてくれるかも知れない
732デフォルトの名無しさん:04/11/04 01:39:00
その程度で協力したとは言えないような
733デフォルトの名無しさん:04/11/04 01:42:21
ついでに次の標準でexceptionとfstreamもワイドバージョン作ってほすぃなぁ・・・。
734デフォルトの名無しさん:04/11/04 01:59:43
wfstreamならばあるが?
735デフォルトの名無しさん:04/11/04 02:03:15
>>734
コンストラクタの話だす。
736デフォルトの名無しさん:04/11/04 02:06:15
?
737デフォルトの名無しさん:04/11/04 02:08:51
>>736
basic_fstream のコンストラクタはファイル名が const char * 決めうちなんだす。
738デフォルトの名無しさん:04/11/04 04:04:52
>>737
自分でラッパクラスつくりゃいいじゃん。と、言ってみたりする今日この頃。
739デフォルトの名無しさん:04/11/04 05:53:22
>>738
マリーアントワネットみたいなこというなよ。
740デフォルトの名無しさん:04/11/04 09:42:48
>738
それをやってくれるのがboostですよ。
741デフォルトの名無しさん:04/11/04 09:44:28
ちなみに、C/C++標準ライブラリでwchar_tを受け付けてくれないのが、
ロケールの初期化とファイルオープンと例外クラス。
742デフォルトの名無しさん:04/11/04 09:45:07
オーペン
743デフォルトの名無しさん:04/11/04 11:41:43
>>741
(内部がどっちで実装されてるかにも拠るけど)localeはどうしようもないと思う。
744デフォルトの名無しさん:04/11/04 12:13:26
spirit超良いね。
ためしにコマンドラインオプションを解析するの作ってみたけど、めちゃ簡単に出来た。
アクションも指定できるから正規表現より断然楽チン。
745デフォルトの名無しさん:04/11/04 12:18:06
何を今更
746デフォルトの名無しさん:04/11/04 13:19:03
文字列->数値もlexcal_cast使うよりreal_p使ったほうが
断然早いし。
747デフォルトの名無しさん:04/11/04 13:23:49
つーかlexcal_castが使わせる気が無い位遅いだけ
748デフォルトの名無しさん:04/11/04 14:18:40
>>746
詳しく
749デフォルトの名無しさん:04/11/04 17:53:36
>>744
コマンドラインオプション解析ならprogram_options (Boost 1.32.0)もよろしく!
750デフォルトの名無しさん:04/11/04 18:04:12
>>749
いまさらイラネ・・・とか思ったけど。
usage message 吐いてくれるのはうれしいかも。
751デフォルトの名無しさん:04/11/04 21:56:26
>>749
poptでいいわ
752690:04/11/05 16:16:58
http://www.boost.org/libs/mpl/doc/ref/Reference/copy.html
boost::mpl::copyのdocサンプルがコンパイルできないのですが、仕様変わったのかな?
753デフォルトの名無しさん:04/11/05 16:20:56
コンパイラもboostのバージョンも書かないから釣り
754デフォルトの名無しさん:04/11/05 16:21:25
>>753
釣りじゃなくてエスパー探しだろ
755752:04/11/05 16:58:10
やっちまった...orz

copy -> foldにしたらいけました。
756デフォルトの名無しさん:04/11/05 19:47:15
boost/date_time/tz_db_base.hpp の 149 行目の
typedef time_zone_names<charT> time_zone_names;

typedef time_zone_names_base<charT> time_zone_names;
の間違いだと思うんですが、
皆さんコンパイルできてます?
757デフォルトの名無しさん:04/11/05 20:43:32
Boost+STLportを使うともれなく実行ファイルが1MB弱になりますが
これってちゃんとDLLを使用してるのでしょうか?
DynamicLinkできるなら やりかたと確認方法教えて下さい
758デフォルトの名無しさん:04/11/05 21:05:05
こりゃ10倍どころの騒ぎじゃないな
759デフォルトの名無しさん:04/11/05 21:12:01
>>757
で、環境は?
760757:04/11/05 21:17:54
とりあえず今コンパイルしている環境は
Win2K、VC6.0、STLport最新リリース、ICU最新リリース、Boost先週までver
ICUはdependency walkerによるとDLLを使っている感じがしますが
BoostとSTLportはDLLを使ってるように見えませんでした。
761757:04/11/05 21:18:19
ageちゃいましたゴメンナサイ・・
762おしえてください:04/11/05 21:59:15
今日からC言語をやり始めたんですが、Borlandとかっていう無償の
ものをダウンロードして環境設定までして見ました。ここまでは
なんとかいったんですが、コンパイル法(?javaでいうとjavacみ
たいなやつ)とかも分からないし、サンプルプログラムもありません
。まだ初心者なので簡単な言葉でここから何をしたらいいか教えて
ください。
763デフォルトの名無しさん:04/11/05 22:12:14
>>762
ゆっくり寝て、明日の朝本屋に行く。
764デフォルトの名無しさん:04/11/05 22:18:36
765デフォルトの名無しさん:04/11/05 22:43:33
>>760
dependency walker で見て DLL を使ってないということは、ホントにスタティック
リンクしてる気が。cl に /MT オプション付けてますか?
766デフォルトの名無しさん:04/11/06 00:30:28
大阪(西梅田)、新宿(JR駅前)のそれぞれ一等地に
拠点を構え、業績急上昇中!未経験者大募集中!の
ソフトウェア開発会社
グリーンシステムを応援するHPです。
http://www.geocities.jp/grs_hp/

応援するスレはこちら!
http://school4.2ch.net/test/read.cgi/job/1077432387/

最高の会社にするため、みんな頑張ってます!
767デフォルトの名無しさん:04/11/06 03:10:11
>>765
DynamicLinkするなら/MDですよ残念
768デフォルトの名無しさん:04/11/07 00:12:31
Spiritでちょっとした字句解析機書いたら警告6000行出た。
ちょっとびびった。
769デフォルトの名無しさん:04/11/07 00:13:22
>>768
ソースより長そうだね。
770質問!:04/11/07 01:27:15
Spirit って使い物になるものですか?
業務でも。
771デフォルトの名無しさん:04/11/07 01:40:38
>>770
使い物になるかどうかはおまえ次第
772デフォルトの名無しさん:04/11/07 01:48:40
>>771
実際に使ったことある?
773デフォルトの名無しさん:04/11/07 01:54:45
>>770
Spiritはスケーラビリティがものすごく高いから何にでも応用できる。
大規模なものでなくても(というか、大規模なものだとコンパイル時間が半端じゃなく長くなりそう・・・)
ユーザーが入力したテキストの書式をちょっとチェックしたり、
その中からデータを読み取るとかだけでも、
正規表現を使うよりも高機能で柔軟で、読みやすいコードが書ける。
テキストじゃなくてもバイナリに対しても使える。
774770:04/11/07 03:53:45
>>773
ありがとう。とても参考になったよ。
775デフォルトの名無しさん:04/11/07 11:10:34
spiritは実行時の性能が悪い(遅い、スタックを消費する)
コンパイル時の負荷が高い、ビルドすらできない場合がある、っつー、困り者。

普通のパーサジェネレータの方がはるかに効率が上。
yacc/lex/bison/flexだってバイナリに対してだって使える。

spiritのメリットは、C++コンパイラだけあれば使える点と、
動的な構文の切り替えが可能な点だけ。

冷静になって考えてみれば、それがほんとにメリットなのかどうか
疑問に思うはず。

何を以ってスケーラビリティが高いといってるのか分からんが、
実際に使ったこともないのに使えるようなこと書くな。
776デフォルトの名無しさん:04/11/07 11:44:39
>それがほんとにメリットなのかどうか
>疑問に思うはず。
本当のメリットはC++のtemplateで実装してあることだ。
俺って超クール?みたいな~ちょべりば~
777デフォルトの名無しさん:04/11/07 11:44:54
spiritに粘着が沸いてますね。
そんなに自分が作ったパーサが出来悪かったんですか?
778デフォルトの名無しさん:04/11/07 11:49:08
>>775
>spiritのメリットは、C++コンパイラだけあれば使える点

これは結構大きいと思う。ちょっとしたパーサ機能を組み込みたいときとか。
べつにspiritマンセーではないけどさ。
779デフォルトの名無しさん:04/11/07 12:15:27
>>777の方が粘着に見えるのは気のせいか。
780デフォルトの名無しさん:04/11/07 12:16:51
自分の敵を粘着扱いしたいバカが複数人いるようだ。
781デフォルトの名無しさん:04/11/07 12:25:19
単純にパーサジェネレータのユーザー人口が増えるからいいんじゃないの。

sript>>>>>>>>>>>>>>yacc/lex/bison/flex
boost最強!!!!!!!!
みたいなのが出てこない限りは。
782デフォルトの名無しさん:04/11/07 12:27:25
Ruby>>>>>>>>>>>BOOST
783デフォルトの名無しさん:04/11/07 14:01:42
782が真理を突いた!
784デフォルトの名無しさん:04/11/07 14:57:56
>775 
RACCより速そうだからいいじゃない?
785デフォルトの名無しさん:04/11/07 15:03:39
STLの代わりとして将来標準で付くライブラリと言う点で物凄くメリットあるでしょ。
どのコンパイラ・どのプラットフォームでもソースをそのままmake出来る様になるんだから・・・
786デフォルトの名無しさん:04/11/07 15:20:33
お前らの言う「将来標準に」って何時よw
クロスプラットフォームならおとなしくRuby使え馬鹿ども。
787デフォルトの名無しさん:04/11/07 15:59:28
>>785
>STLの代わりとして

なぜそういう認識になるのか分からない。
BoostはSTLの代替ではなく、相互補完の関係にあると思うんだが?
788デフォルトの名無しさん:04/11/07 16:06:27
大体メリットあるでしょって誰に反論してんだよ
789デフォルトの名無しさん:04/11/07 22:58:15
>>782,>>783,>>786
Ruby厨キタ━━━(゚∀゚)━━━━!!
790デフォルトの名無しさん:04/11/07 23:00:12
Rubyって遅いんでしょ
791デフォルトの名無しさん:04/11/07 23:07:29
いまどき言語による処理速度の違いなど大した意味を持たないだろう。
専ら重要だとされているのは保守性だよね。
なるべく高速でないと困るようなアプリケーションでは相応の開発方法があるだろう
けれど、どちらかというとそういうアプリケーションは少数派だし、場合によっては
ネイティブなライブラリとして機能が提供されているでしょう?
792デフォルトの名無しさん:04/11/07 23:12:57
よって、Rubyが最強だと愚考する次第であります。
793デフォルトの名無しさん:04/11/07 23:19:05
そのネイティブなライブラリをRubyで書けるのか?
794デフォルトの名無しさん:04/11/07 23:20:12
ハァ?お前ちゃんと人の話聞いてる?
795デフォルトの名無しさん:04/11/07 23:20:53
自作ソフトにスクリプト組みたいときはRubyじゃ駄目でしょ。
796デフォルトの名無しさん:04/11/07 23:26:43
お前にはね。
797デフォルトの名無しさん:04/11/07 23:30:08
Rubyは素晴らしい言語。
日本人はもっと誇りに思うべきだ。
798デフォルトの名無しさん:04/11/07 23:32:24
>>795
残念だけど、Rubyはフィルタしているんで見えないんだ。
799デフォルトの名無しさん:04/11/07 23:34:37
>>796
フリー/シェアウェア/商用問わず、ソフトウェアに独自スクリプトを組み込みたい時に
Rubyを使えるのか?Rubyってそんなライブラリあるの?ライセンスは?
800デフォルトの名無しさん:04/11/07 23:36:32
tuku------------------------------ru
801デフォルトの名無しさん:04/11/07 23:39:30
>799
一応、Raccが使える……けど、

Ruby厨(に化けたアンチ)に反応するなよ
802デフォルトの名無しさん:04/11/07 23:41:08
>>801
いやすまん、純粋な興味だ。Rubyに限らずスクリプト言語は嫌いなんで知らないんだよ。
803デフォルトの名無しさん:04/11/07 23:43:44
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
804デフォルトの名無しさん:04/11/07 23:48:09
どっちも痛いな。
805デフォルトの名無しさん:04/11/07 23:54:45
なんで C++ template スレで Ruby の議論してるんだ? そんなことより
今は Boost 1.32 が旬だろ。
806デフォルトの名無しさん:04/11/07 23:55:14
Ruby>>>>>>>>>>>>>>>>>>>>>804
807デフォルトの名無しさん:04/11/08 00:06:07
>>805
だっていつまで待っても出ねぇんだもん。
808デフォルトの名無しさん:04/11/08 00:16:14
10分前に出ました。
809デフォルトの名無しさん:04/11/08 00:21:24
810デフォルトの名無しさん:04/11/08 00:30:08
>>808
注目すべき最新の変更及び追加は?
811デフォルトの名無しさん:04/11/08 00:41:23
kita-ってやらないのkita-って
812デフォルトの名無しさん:04/11/08 00:42:25
809は何?
813756:04/11/08 01:00:55
マジですか?
boost/date_time/tz_db_base.hpp 直って無いような気が・・・?
814デフォルトの名無しさん:04/11/08 01:43:52
>>807
draft tar ball 置いてあるよ。
815デフォルトの名無しさん:04/11/08 02:02:45
>>814
正規ってことでは
816デフォルトの名無しさん:04/11/08 19:16:37
spiritのast_parseでCの=演算子のように右から左への結合をする方法は無いでしょうか?
ast_tree_policyのソースを見たところ問答無用で左から右に結合しているようなので
やむを得ず独自のpolicyを書きましたが、
結構長いのでバージョン間の互換性などを考えるとast_parseで出来たほうがうれしいです。
817デフォルトの名無しさん:04/11/08 20:13:32
boost::mplで boost::mpl::plusにboost::mpl::int_<1>を
バインドってできないのかな?
//こういう感じで
typedef bind_c<
boost::mpl::plus
,boost::mpl::lambda::_1< boost::mpl::int_<1> >
>::type plus1;
818デフォルトの名無しさん:04/11/09 01:14:11
>>817
typedef bind< plus<>, _1, int_<1> > b;
cout<<b::apply<int_<10> >::type::value<<endl;
819デフォルトの名無しさん:04/11/09 02:55:16
あと

template<class Int> struct plus1 : public plus<Int, int_<1> >{ };
cout << plus1<int_<10> >::value << endl;

とか

typedef plus<_1, int_<1> > plus1;
cout << apply<plus1, int_<10> >::type::value << endl;
820817:04/11/09 11:36:05
>>818-819
thx.
(bind+lambda)の場合はメタ関数クラスになるから直接applyできて、
外部applyは(lambda)と(bind+lambda)の両方okと。
継承版はすっきりしてイイですね。

821デフォルトの名無しさん:04/11/10 02:20:06
lambdaはいいとして
bindって何に使うの?
822デフォルトの名無しさん:04/11/10 02:43:08
Lisp(scheme)で言うと、

(lambda (x y) (+ x y))という加算lambda式(二引数関数)がある時、

((lambda (x y) (+ x y)) 5) → (lambda (y) (+ 5 y))

という引数の部分的なapplyに相当するのがbind。

(bind (lambda (x y) (+ x y)) '1st 5)
823デフォルトの名無しさん:04/11/10 07:46:56
カリー化だね
824デフォルトの名無しさん:04/11/10 07:50:03
おい、俺は今なあ、英語の筆記体のrがうまく書けなくて、
それでギリシャ語の「ラムダ」に似てるから、ラムダみたいに書けばいいのかと思って
調べてみたらラムダはrじゃなくてlだったということがわかったところだぞ。
そして偶然このスレを見たらlambdaとか書いてあって驚きだよ。
これがシンクロニシティってやつなのか?
825スレ違いだが:04/11/10 09:29:29
>>823
逆。uncurry。
826確かにすれ違いだが:04/11/10 09:52:39
え?逆?
827デフォルトの名無しさん:04/11/10 09:53:38
カレー食いたくなってきた
828デフォルトの名無しさん:04/11/10 11:30:03
>824
てゆうかガンマでそ
829デフォルトの名無しさん:04/11/10 11:31:45
>>828

>>824 は「筆記体のr」と言っております。
830デフォルトの名無しさん:04/11/10 12:03:19
低レベル者で申し訳ないですが
構造体を vectorやmap等に積み込む時ってどうします?
auto_pointer系に詰めて乗せるのが一般的なんですか?
831デフォルトの名無しさん:04/11/10 12:23:02
>>830
コピーが低コストならそのままコンテナの要素にする。
コピーできないor高コストならboost::shared_ptrとかに乗せる。
832デフォルトの名無しさん:04/11/10 12:37:25
>>831
newで生成した場合
そのままコンテナ要素にしたらdeleteがめんどいような・・・
833デフォルトの名無しさん:04/11/10 12:39:33
>>832
newで生成したのならboost::shared_ptrとかに乗せたらいいじゃない。
834デフォルトの名無しさん:04/11/10 14:50:35
ttp://www.tietew.jp/cppll/archive/7539
これをみてちょっと良いなと思ったのですが、
boost辺りで同じ事を出来ないでしょうか?lambdaなどを見てるとなんだか出来そうで。

このライブラリを使えればベストなのですが、なかなか
835デフォルトの名無しさん:04/11/10 15:29:22
>>834
>boost辺りで同じ事を出来ないでしょうか?
自分で同じこと(スコープ区切るだけ)をすれば良いだけではないですか?
その記事に書いてあること以上の何をお望みですか?
局所関数の簡単な生成?
836デフォルトの名無しさん:04/11/10 15:43:52
>>835
ええと、要するに関数内関数の話です
struct辺りを使ってトリッキーに実現は出来るけど、あんまし読みやすくならないんですよね
これはなかなか可読性も良く、速度も落ちないみたいなんでいいなと
837デフォルトの名無しさん:04/11/10 19:54:21
俺なら普通に関数に分けるけどね。
838デフォルトの名無しさん:04/11/10 20:15:28
関数内関数を擬似的に実現させる方法はいろいろあると思うんだけど、
テンプレート引数に使えるのはある?
てゆーか、ありえる?
839デフォルトの名無しさん:04/11/10 20:20:38
テンプレート引数として渡すには最低でもファイル内スコープを持ってないとダメだからたぶん無理だろう。
840デフォルトの名無しさん:04/11/10 20:24:00
>>838
boost::lambdaで強引に書くくらいかな…
841デフォルトの名無しさん:04/11/10 21:15:54
ところで何でローカルクラス等だと渡せないの?
外部リンケージとテンプレートみたいにコンパイラの中の人の仕事を楽にするため?
842デフォルトの名無しさん:04/11/10 21:38:36
>>841
インライン展開しない/できないときのため
843デフォルトの名無しさん:04/11/10 22:41:38
本物はやっぱり便利でっせ

EnumFindWindows(caption) {
 int find = 0;
 int b = malloc(512);
 EnumWindows(lambda __stdcall(hwnd, lparam) {
  GetWindowText(hwnd, b, 512);
  if (!strcmp(b ,caption))
  find = hwnd;
  return find ? 0 : 1;
},0);
 free(b);
 return find;
}
844デフォルトの名無しさん:04/11/10 23:00:50
>838
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999294620&res=159&fi=no
インライン化を諦めるならこういうやり方もあるにはあるんですが・・・.
845デフォルトの名無しさん:04/11/11 00:03:06
>>843
このスレ的に、EnumWindowsはSTLSoft使って欲しい。
846デフォルトの名無しさん:04/11/11 01:01:59
>>838
つい最近cppllに出てたもの
ttp://www.tietew.jp/cppll/archive/11286
847デフォルトの名無しさん:04/11/11 01:07:16
>>846
内部関数から親関数のローカル変数って参照できる?

そういやPascalってどうなんだろ
たしか内部関数作れるんだよね。
848デフォルトの名無しさん:04/11/11 01:18:07
>>846
ただの内部関数はそれこそイディオムが成立するくらい誰でも出来るのです。
このスレ的にはテンプレート化することが重要なのれす。
849デフォルトの名無しさん:04/11/11 01:20:29
Pascalはスタックポインタ、フレームポインタとは別のレジスタを保存して
静的スコープの外側へのリンクを張りながら呼び出すんで。
850デフォルトの名無しさん:04/11/11 01:42:57
>>846
ただの関数ポインタとして扱われるからリンケージが関係なくなるのかな
851デフォルトの名無しさん:04/11/11 01:51:35
>>847
846さんの方法だと無理です.
local functorなら参照したいローカル変数のポインタを明示的に渡すことで,
一応可能にはなると思います.
852デフォルトの名無しさん:04/11/11 02:01:57
>>851
functorだとテンプレート引数に出来ないというジレンマ
853デフォルトの名無しさん:04/11/11 02:08:38
>>847
元の関数がメンバ関数だと使えない手法だけど、
ttp://www.tietew.jp/cppll/archive/2507
みたく関数をクラス化してしまうのはどう?
元の関数でローカル変数だったものはメンバ変数にしてしまえば
当然だけどメンバ関数から利用可能だし。
854デフォルトの名無しさん:04/11/11 02:15:13
>852
なので844みたいなのを考えてみました.
でも,よく考えれば846さんの方法でもbindすればある程度のことは可能ですね.

#include <string>
#include <algorithm>
#include <iostream>
#include <boost/lambda/bind.hpp>
int main(){
using namespace std; using namespace boost::lambda;
struct local{
static bool match(string const &l, string const &r)
{ return l == r; }
};
string a[] = {"Marc", "Shawn", "George", "Robert"};
string match = "George";
string *found = find_if(a, a + 4, bind(local::match, _1, match));
cout << found - a << endl;
}
855デフォルトの名無しさん:04/11/11 03:33:31
>>854
関数内関数を作ったつもりだろうけど結局static関数をつくったら意味が無いという罠だけどね
856デフォルトの名無しさん:04/11/11 04:01:11
static関数だとなんで意味無いの?
857デフォルトの名無しさん:04/11/11 06:52:01
>856
インライン展開されないんじゃない?
858デフォルトの名無しさん:04/11/11 08:50:01
>>847
inner関数が実行されている時は、
outer関数も実行されている時。
これは関数のスコープ規則によって必ず約束される。

inner関数にグローバルスコープを持たせると、
この制約が破られるから、>>838は駄目。

Lisp/Schemeのようにクロージャで環境問題を解決するか、
局所的なスコープを持った引数を渡されたテンプレートの特殊化は、
局所的なスコープを持つとする必要がある。
member関数の場合、型システムに帰着できるが、
inner関数はスコープ問題になってしまうので、C++は避けているんだろう。
859デフォルトの名無しさん:04/11/11 08:51:36
>>856
thisがなくていいの? ってことでしょ。
860デフォルトの名無しさん:04/11/11 12:38:15
外部リンケージを持たない型をテンプレートに渡せるようにすればいいだけじゃん。
名前のバッティングとかいろいろ言ってるけどそんなの無名namespaceと同じ方法で解決できるし。
861デフォルトの名無しさん:04/11/11 16:53:12
「名前のバッティング」って具体的にどのレス?
862デフォルトの名無しさん:04/11/11 21:37:23
>>860
inline 関数中で定義されたクラスをどうするかっつー問題が。
863デフォルトの名無しさん:04/11/11 22:16:11
>>860は自由変数をどう扱うかっていう、
Lispの世界で環境問題って言われている問題を理解してないんでしょう。

関数のスコープとライフタイムの一致は、古典的手続き型言語の一つの特徴。
Pascalがもっとも端的。
864デフォルトの名無しさん:04/11/12 00:37:46
windowsでフルパスからpathを作成したいのですが、
どうすべきなのでしょうか?
(VC7.1,boost1.31,boost1.32draft)

boost::filesystem::path full_path("c:\test");

//c:\test error
//c:/test error
865デフォルトの名無しさん:04/11/12 00:53:20
866デフォルトの名無しさん:04/11/12 00:57:48
Javaはfinal指定しておけば関数の外に出てからも参照できるね。
867デフォルトの名無しさん:04/11/12 01:05:41
"c:\test""c:\test""c:\test""c:\test""c:\test""c:\test""c:\test""c:\test"
"c:\test""c:\test""c:\test""c:\test""c:\test""c:\test""c:\test""c:\test"
"c:\test""c:\test""c:\test""c:\test""c:\test""c:\test""c:\test""c:\test"
"c:\test""c:\test""c:\test""c:\test""c:\test""c:\test""c:\test""c:\test"
"c:\test""c:\test""c:\test""c:\test""c:\test""c:\test""c:\test""c:\test"
868デフォルトの名無しさん:04/11/12 01:07:51
ま、"c:\\test"だわな。
869デフォルトの名無しさん:04/11/12 18:38:30
質問です

class Hoge{
};

typedef boost::shared_ptr<Hoge*> pHoge;

class Mage : public Hoge{
vector<pHoge> array;
public:
Mage(){
pHoge o = this;
array.push_back( o );

for( int i = 0; i < 3; i++ ){
pHoge buf( new Hoge );
array.push_back( buf );
}
}

~Mage(){
array.clear();
}
}

このように派生元(Hoge)のポインタと
新規に追加する(Hoge)との混合の array を生成すると
array.clear()時に失敗してしまいます

これを解決する方法があれば教えてください
870デフォルトの名無しさん:04/11/12 18:42:14
>>869
おもしろくない。
871デフォルトの名無しさん:04/11/12 19:52:24
>>869
それコンパイル通らねえだろ。
872デフォルトの名無しさん:04/11/12 20:05:24
コードがメチャクチャだし、テンプレート引数がHoge*なのもおかしい
873デフォルトの名無しさん:04/11/12 20:21:14
書き直します

class Hoge{
};

typedef boost::shared_ptr<Hoge*> pHoge;

class Mage : public Hoge{
vector<pHoge> array;
public:
Mage(){
pHoge o( this );
array.push_back( o );

for( int i = 0; i < 3; i++ ){
pHoge buf( new Hoge );
array.push_back( buf );
}
}

~Mage(){
array.clear();
}
};

が、>テンプレート引数がHoge*なのもおかしい というのはなぜでしょうか?

Mageに継承されたHoge自身を array の先頭に格納し、
後々 pHoge buf( new Hoge ); のように
別のデータを追加していきたいと考えているのですが…
874デフォルトの名無しさん:04/11/12 20:24:33
>>873
boost::shared_ptrの使い方をもう一回調べて来い
875デフォルトの名無しさん:04/11/12 20:27:12
そもそもshared_ptrとはなんぞやから調べたほうが良いと思う。
876デフォルトの名無しさん:04/11/12 23:15:23
> typedef boost::shared_ptr<Hoge*> pHoge;

typedef boost::shared_ptr<Hoge> pHoge;
ちゃうんかと。
877デフォルトの名無しさん:04/11/12 23:33:36
>>876
それはわかっとる。それに、気づくのが遅いよ君。
878デフォルトの名無しさん:04/11/13 00:59:13
やれやれ
879デフォルトの名無しさん:04/11/13 10:56:08
boost::filesystem::pathの罠

path t("c:\\1-2-3",native);
// t /= "4 5 6"; //ERROR
// t /= path("4 5 6"); //ERROR
t /= path("4 5 6",native);//OK

毎回native入力するの面倒な気が...
880デフォルトの名無しさん:04/11/13 12:35:58
>>879
そんな駄目ライブラリは窓から投げ捨てろ
881デフォルトの名無しさん:04/11/13 12:38:54
>>880
CUIならいいのー? にゃんにゃん
882デフォルトの名無しさん:04/11/13 13:08:41
>>881
CUIでも窓なら駄目。
883デフォルトの名無しさん:04/11/13 13:56:59
boost::filesystemの作者がアンチM$だしな
884デフォルトの名無しさん:04/11/13 15:03:50
アンチMSとかの問題じゃなくてスペース含んだパスの取り扱いの問題だろ?
試してないがスペースをエスケープすればいいんでないの?
885デフォルトの名無しさん:04/11/13 15:24:49
>>879
http://www.boost.org/libs/filesystem/doc/path.htm#name_check-_mechanism

path::default_name_check(native);
path t("c:\\1-2-3"); // OK
t /= path("4 5 6"); // OK
886デフォルトの名無しさん:04/11/13 17:55:03
どっちにしろマルチバイト文字扱えないんだからWindowsじゃ使えないだろ
887デフォルトの名無しさん:04/11/13 20:37:09
Rubydesubetekaiketu !!!!!!!!!!!!!!!
888879:04/11/13 23:38:24
>>885
thanks.
そんな方法があったとは...

>>886
separatorと検出する方法(MBCSを使う)を
外部指定できれば、可能性ないかな?
889デフォルトの名無しさん:04/11/13 23:55:41
唯一、MBCSのことを考えてくれたMicrosoftも.NETに移行だし、
もう、C++でMBCSというのは、完全に無いんだろうな。
890デフォルトの名無しさん:04/11/14 01:09:39
>>889
C++/CLI
891デフォルトの名無しさん:04/11/14 03:01:51
>>888
マルチバイト対応もワイドキャラクタ対応も数時間あれば出来るようなことだが
作者にその気がないのでしょうがない。
892デフォルトの名無しさん:04/11/14 03:25:26
893デフォルトの名無しさん:04/11/14 10:48:46
どうせboost::filesystemなんて標準には含まれないのは分ってるんだから
どっちでもいいのでは。使いたくないのなら使わなきゃいいだけなのでは
894デフォルトの名無しさん:04/11/14 15:18:22
>>893
なんで分かってるの?
895デフォルトの名無しさん:04/11/14 17:45:18
>>894
C++を動かす環境にファイルシステムがあるとは限らないから。
896デフォルトの名無しさん:04/11/14 17:47:48
fopenとかfstreamとかどうなるんだ
897デフォルトの名無しさん:04/11/14 17:54:38
標準のfopenやfstreamは名前を指定してストリームを作成する汎用の手段を提供してるに過ぎない。
開くストリームは例えば特定のメモリ領域に名前をつけたものだったり、
極端な話WebページをGETしてもいい。
ファイルシステムとは違う。
898デフォルトの名無しさん:04/11/14 18:53:13
現状含まれていないのを根拠に、将来含まれないのが分かってるというのかね?
899デフォルトの名無しさん:04/11/14 19:00:52
>897
へりくつー
900デフォルトの名無しさん:04/11/14 19:02:36
>>899
無知ー
901デフォルトの名無しさん:04/11/14 19:17:15
>>895
freestanding と hosted environment をゴッチャにしてないか?
902デフォルトの名無しさん:04/11/14 20:21:35
おとうさまー
903デフォルトの名無しさん:04/11/14 20:38:37
(棒読み)
904デフォルトの名無しさん:04/11/15 01:23:53
マルチバイトじゃパラメタライズできんから、
テンプレートマクロ集というカテゴリで出すにはふさわしくないだけでしょ。
出すならまた別のライブラリに含める形で。
905デフォルトの名無しさん:04/11/15 01:24:46
結論: 日本語をちゃんと扱いたきゃRubyを使え馬鹿ども
906デフォルトの名無しさん:04/11/15 09:39:26
>>904
> マルチバイトじゃパラメタライズできんから、

君、レベル低すぎ。

907デフォルトの名無しさん:04/11/15 12:22:42
あほか。エンコードごとに
operator[]やfindやsubstrも変更だろ。
場合によっては効率面でopertor[]を
ランダムアクセス禁止にしなければならなくなる。
908デフォルトの名無しさん:04/11/15 13:30:11
パラメタライズ出来るじゃん(w
909デフォルトの名無しさん:04/11/15 15:05:10
テンプレートでやるメリットがあるとは思えない。
そもそもbasic_stringと互換性が取れなくなるからiostream他との相性も悪くなる。
だから通常のライブラリにすればいいの。
910デフォルトの名無しさん:04/11/15 15:48:05
ISO-2022 7bit系
EUC系
Shift_JIS
とか違う部分をパラメタライズして、
共通部分をまとめればいいじゃない。

> そもそもbasic_stringと互換性が取れなくなるからiostream他との相性も悪くなる。
> だから通常のライブラリにすればいいの。

「だから」って…アフォだろ。
911デフォルトの名無しさん:04/11/15 17:15:57
char|wchar_tみたいな特別な型を作り出すのは無理?
BOOST_STRONG_TYPEDEF(char,mbc);
char str[] = "123";
mbc mbs[] = "123";//error
912デフォルトの名無しさん:04/11/15 17:41:08
typedef singned char EUCCHAR;
typedef unsigned char SJISCHAR;
これならできるんじゃないか?
913デフォルトの名無しさん:04/11/15 17:42:40
えー
914デフォルトの名無しさん:04/11/15 19:30:20
>>903
まさかスルーされてないとは思わなかったよありが㌧w
915デフォルトの名無しさん:04/11/15 21:26:10
>>907
basic_stringですら既にfindとかはパラメタライズされているような。
916デフォルトの名無しさん:04/11/16 00:31:31
>>911>>912
何故そのレベルでやろうとするんだ…

char, wchar_t のカテゴリじゃなくて、
char [], wchar_t[] と同じレベルで別カテゴリにあるのがmbcsだよ。
だからbasic_stringじゃなくて、mbc_stringだわな。
interfaceは可能な限りbasic_string風で。

とはいえ今後需要は少なそうだね。
917デフォルトの名無しさん:04/11/16 01:11:34
>>910-912
このへんはネタだと思いたい。
918デフォルトの名無しさん:04/11/16 01:14:58
boost 1.32 ブランチトジターョ
919デフォルトの名無しさん:04/11/16 01:21:49
wchar_tにしてまでMBCS扱いたくないよな・・・でもサロゲートが・・・。
MSはもうWCHAR=2バイトにしちゃったからこれからずっと2バイトなんだろうな。
DCHAR=4バイトとか出してきそうで怖いな。
920デフォルトの名無しさん:04/11/16 03:17:36
www.boost.org 更新キター
A targeted release date is November 17.
921デフォルトの名無しさん:04/11/16 03:18:41
またコンパイルし直しかなあ。
boostライブラリのコンパイルはpchとか作ってくれないから時間かかるんだよなあ。
922デフォルトの名無しさん:04/11/16 14:06:23
hash_mapの中身を保存したいんだけど別アイテムへの自己参照してるんだけど
良い方法ないっすかね~?
シリアライズまだ?
923デフォルトの名無しさん:04/11/17 00:41:46
>>922
draftから引っ張り出せばいいよ。
924デフォルトの名無しさん:04/11/17 02:32:16
aleksey.jpg ワロタ
925デフォルトの名無しさん:04/11/17 17:24:46
template <class T>struct Connection
{
friend T;
private:
static void test()
{std::cout << typeid(T).name() << ":" << typeid(Connection).name()<< std::endl;}
};

struct Friend :public Connection<Friend>
{
using Connection<Friend>::test;
};

private関数をusingしてて思ったんだが、
friendにはテンプレート引数が使えない?
(VC7.1 OK)(VC6 error)(GCC3.4.3 error)

926925:04/11/17 17:42:21
template <class T,class L>struct Connection :public L
{
friend T;
private:
static void test()
{std::cout << typeid(T).name() << ":" << typeid(Connection).name()<< std::endl;}
};
class Enemy
{
static void secret(){ std::cout << "secret!!" << std::endl; }
};
struct Friend :public Connection<Friend,Enemy>
{
using Connection<Friend,Enemy>::test; //friend経由でusingする
using Connection<Friend,Enemy>::secret;//friend経由でusingする
};

Friend::secret();//secret!!
やっぱだめぽ
927デフォルトの名無しさん:04/11/17 20:14:24
>>926
friend class T; でもだめか?
928925:04/11/17 23:22:49
>>927
どーも。
期待通り?VC7.1でもエラーになってくれました。
(template argはfriend指定できないみたい)
class Enemy
{
friend class Friend;//secretに必要

template <class T,class L>struct Connection :public L
{
friend class Friend;//testに必要 ->VC7.1はこっちだけでもOKだった...orz
929デフォルトの名無しさん:04/11/18 03:39:17
C++Primer第3版日本語版P865~866
クラステンプレートにおけるfriend宣言を見ると、
テンプレート・パラメータはfriendクラスそのものには使えないが、friendクラス
のテンプレート・パラメータの方を指定する事ができる。



template <typename T>
class Foo {
//いろいろ
};

template <typename T>
class A {
 friend class Foo<T>;
};
930デフォルトの名無しさん:04/11/18 04:15:21
>>928
そこでboostですよ。
#include <boost/mpl/identity.hpp>
template <class T>struct Connection
{
typedef typename T::type X;
friend X;
private:
static void test()
{std::cout << typeid(X).name() << ":" << typeid(Connection).name()<< std::endl;}
};

struct Friend :public Connection< boost::mpl::identity<Friend> >
{
using Connection< boost::mpl::identity<Friend> >::test;
};
931925=928:04/11/18 09:30:32
>>929,930
ありがとうございました。関数の方はVC7.1とGCC3.4.3でOKでした。
class Friend_Tag;
template <class T,class L>struct Connection;
template <typename T>class Friend;
class Enemy
{
friend class Friend<Friend_Tag>;//GCCの場合必須
static void secret(){ std::cout << "secret!!" << std::endl; }
static const int secret_data = 1000000;
};
template <class T,class L>struct Connection :public L
{
/*C++Primer第3版日本語版P865~866
クラステンプレートにおけるfriend宣言を見ると、
テンプレート・パラメータはfriendクラスそのものには使えないが、friendクラス
のテンプレート・パラメータの方を指定する事ができる。*/
friend class Friend<T>;
typedef Connection<T,L> connect_type;
private:static void test()
{std::cout << typeid(T).name() << ":" << typeid(Connection).name()<< std::endl;}
static const int test_data = 100000;
};
class Friend_Tag{};//friendクラスのテンプレート・パラメータの方を指定
template <typename T=Friend_Tag>class Friend :public Connection<T,Enemy>
{public:
using connect_type::test; //friend経由でusingする
using connect_type::secret;//friend経由でusingする
//using connect_type::test_data; //friend経由でusingする GCC3.4.3(OK) VC7.1(NG)
//using connect_type::secret_data;//friend経由でusingする GCC3.4.3(OK) VC7.1(NG)
};
932デフォルトの名無しさん:04/11/18 11:09:35
>>931
君にはC++Templatesをお勧めしよう。
大きな声では言えないが、CHMやPDFはよく探せばどこにでも落ちている。
俺は画面で見るのが嫌なのでAMAZONで買ったが。
しかしこんな名著がなぜ日本語訳化されないのか不思議。
933デフォルトの名無しさん:04/11/18 11:45:59
これ読んだ人はいますか?
C++ Template Metaprogramming
: Concepts, Tools, and Techniques from Boost and Beyond
http://www.amazon.com/exec/obidos/tg/detail/-/0321227255/
934デフォルトの名無しさん:04/11/18 11:56:45
>>933
まだだけど内容が偏ってそうなタイトルだな。
935デフォルトの名無しさん:04/11/18 12:00:47
936936:04/11/18 14:05:19

std::string a(){ return ""; }
int b(){ return 0; }

template< void (*pf)() >
struct A
{ static const int id=0; };

template< class R, R (*pf)() >
struct A<pf>
{ static const int id=1; };


int main()
{
 std::cout << A< &a >::id << std::endl;
 std::cout << A< &b >::id << std::endl;
 return 0;
}
error C2764: 'R' : テンプレート パラメータは部分的特殊化 'A<pf>' では使用されません。
main内をいじくらずにコンパイルをとおすにはどうしたらいいですか?
937デフォルトの名無しさん:04/11/18 14:13:01
>>936のコードをBCCでやろうとしたらできちゃった。
これじゃ俺には答えられん。OTL
938デフォルトの名無しさん:04/11/18 16:44:50
>>936
お前がやりたいのはこれか?

template <typename FP>
struct A;

template <typename R>
struct A<R (*)()>
{enum{id = 0};};

template <>
struct A<void (*)()>
{enum{id = 1};};
939デフォルトの名無しさん:04/11/18 17:21:54
>>938
936さんは外部リンケージのある関数ポインタをテンプレートの
非型パラメータに取りたいんでしょう.

>>936
ですか?
そのコードはprimary templateとその特殊化で非型パラメータの型が異っていて
(void (*)()とR (*)()),そういう特殊化は許されないです.
なのでmain関数をいじらずにそれを通すのは無理と思います.
見たところ,関数ポインタからその戻り値がvoidかどうかを判別する静的整数値が
欲しいと見受けられますが,その解釈で良いですか?
940デフォルトの名無しさん:04/11/19 18:49:20
STLPortってシリアライズ対応してるんですか?
みあたらないのですが・・・・・
941936:04/11/19 19:40:16
>>939 やりたいことは関数ポインタを非型パラメータとして渡し戻り値の型をresult_tとかで取得できるようにしたいです
以下のソースでとりあえず関数ポインタを単独で渡すことに成功して、いけるかとおもったのですが全部null_tですた
試しに非型パラメータ経由で呼び出したらおちますたorz
template<class T>struct aaa{};
int a(){return 0;}
std::string b(){return "";}
aaa<int> c() { return aaa<int>(); }
struct null_t{};
template<void *p,class R=null_t>struct A
{
 typedef null_t result_t;
 static const id = 0;
};
template<class R, R (*const pf)()>struct A< pf, R >
{
 typedef R result_t;
 static const id = 1;
 test(){ (*pf)(); }
};

int main()
{
 std::cout << typeid(A<&a>::result_t).name() << " " << A<&a>::id << std::endl;
 std::cout << typeid(A<&b>::result_t).name() << " " << A<&b>::id << std::endl;
 std::cout << typeid(A<&c>::result_t).name() << " " << A<&c>::id << std::endl;
 A<&a> a; A<&b> b; A<&c> c;
 return 0;
}
942デフォルトの名無しさん:04/11/19 20:31:48
>>941
それは無理。
typeofが使える環境ならいいけど。
943デフォルトの名無しさん:04/11/20 01:24:25
gcc3.2 3.3 3.4 以降 の libstdc++ と、STLportでは、どっち使ってます?
gcc も version 3から、c++ 対応が強化されてますし。

http://boost.sourceforge.net/regression-logs/
みても、stlport は、いらないかと。
VC がないんだけど、前はあったような気がするのだが。

VC7.1 の場合も標準準拠具合は進んでるし、STLport いらないかも?

でもSTLport のほうが速いのかな。
944デフォルトの名無しさん:04/11/20 01:31:21
STLPortのデバッグモードがいいよ
945デフォルトの名無しさん:04/11/20 01:57:31
>941
942さんの言うようにその要求はまさにtypeofの機能なので厳しいでしょう.
戻り値がvoidかそうでないか等のように,オブジェクトのある程度の種別を
識別するコンパイル時定数を得ることなら以下の手法で出来ますが・・・.

#include <iostream>
struct yes_t{ };
struct no_t{ yes_t padding[256]; };
template<class T> no_t is_void_ret(T (*)());
yes_t is_void_ret(void (*)());
#define IS_VOID_RET(pf) (sizeof(is_void_ret(pf)) == sizeof(yes_t))
void f(){ };
int g(){ return 0; }
int main()
{
std::cout << IS_VOID_RET(&f) << std::endl;
std::cout << IS_VOID_RET(&g) << std::endl;
}

ちなみにこの手法の究極形が,既存のC++の文法のみでtypeofを実現するってヤツなんですけどね.
946デフォルトの名無しさん:04/11/20 15:53:55
boost1.32.0 2004-11-19 18:47
キタ━━━━(゚∀゚)━━━━!!
ttp://sourceforge.net/project/showfiles.php?group_id=7586
947デフォルトの名無しさん:04/11/20 16:46:57
boost1.32.0キタ━━━━(゚∀゚)━━━━!!
948Booster達の午後^H^H週末:04/11/20 16:51:38
boost1.32.0やっとキタ━━━━(゚∀゚)━━━━!!
949デフォルトの名無しさん:04/11/20 16:54:28
おまえら気づくのおせーよw
950デフォルトの名無しさん:04/11/20 17:03:38
タグは打たれないのかい?
951デフォルトの名無しさん:04/11/20 20:53:41
すみません、質問があります。
boostのファンクタを使ってみようと思っているのですが、
脳がこんがらがってきました。

boost::shared_ptr< hoge > pointer;
というポインタと、
std::list< boost::weak_ptr< hoge > > container;
というコンテナがあり、
コンテナの中からremove_if()でpointerと同じ値を削除したいのです。

ところが、コンテナの中身がweak_ptrなので、一度lock()しないといけません。
こういう場合、どういうファンクタを書けばいいのでしょうか?
出来ればlambdaを使わず(怖すぎ)、bindやmem_fnだけで書く方法を
教えていただけないでしょうか。
952951:04/11/22 03:16:59
誰か答えろよ。
953デフォルトの名無しさん:04/11/22 06:38:53
頭がこんがらがるようなことはやらないが吉。
954デフォルトの名無しさん:04/11/22 14:56:58
955デフォルトの名無しさん:04/11/22 14:58:17
誰だよ昨晩から上げ荒らしをしているばかは。一応通報したからね。
956デフォルトの名無しさん:04/11/22 16:40:20
>>952
解っているがおまえの態度が気に入らない。
957デフォルトの名無しさん:04/11/22 17:45:39
>>955
どうやらRuby信者の荒らしみたい
958デフォルトの名無しさん:04/11/23 14:01:29
boost lambda で再帰ってどう書けばいいのかな?
959デフォルトの名無しさん:04/11/23 14:53:07
>>958
具体例プリーズ
960デフォルトの名無しさん:04/11/23 18:14:16
>>958
試してないけどboost::functionも使ってこんな感じで行けない?
function<int (int)> f= ret<int>(if_(_1==0)[1].else_[_1*f(_1-1)]);
cout<< f(5)<< endl;
961デフォルトの名無しさん:04/11/23 18:22:51
boostの悪い使い方の典型だな
962958:04/11/24 17:50:36
>>960
function<int (int)> f= ret<int>
(if_then_else_return(_1==1,1,_1*f(_1-1)));
とかもやってみたけど駄目みたい。(再帰はムリなのかもしれぬ...


963デフォルトの名無しさん:04/11/24 17:55:29
ここまでしてlambda使いたいか?て思う
半年ぐらいC++から離れたら読めなくならない?
964デフォルトの名無しさん:04/11/24 18:59:33
>>962
fの呼び出しはbindで包まないとだめだと思うが。
俺の環境ではif_then_elseが使えないから、
function<int (int)> f= bind<int>(var(f), _1);
で、スタックオーバーフローを確認した。
965デフォルトの名無しさん:04/11/24 20:37:30
main() {
 int (*tarai)();
 tarai = lambda(x,y,z) {
  if (x <= y) return y;
  else return tarai(
   tarai(x - 1, y, z),
   tarai(y - 1, z, x),
   tarai(z - 1, x, y));
  };

 (lambda(x,y,z){ printf("tarai => %d\n",tarai(x,y,z)); })(12,6,0);
}

これをboostで書き直すとどうなるの?
966デフォルトの名無しさん:04/11/25 02:07:57
>>965
#include <cstdio>
#include "boost/function.hpp"
#include "boost/lambda/lambda.hpp"
#include "boost/lambda/bind.hpp"
#include "boost/lambda/if.hpp"
#include "boost/bind/protect.hpp"
#include "boost/ref.hpp"

int main()
{
  boost::function<int (int,int,int)> tarai;
  using namespace boost::lambda;
  using boost::protect;
  using boost::ref;
  tarai =
    if_then_else_return((_1 <= _2)
      , ret<int>(_2)
      , bind(ref(tarai)
        , (protect(bind(ref(tarai), _1 - 1, _2, _3)))(_1,_2,_3)
        , (protect(bind(ref(tarai), _2 - 1, _3, _1)))(_1,_2,_3)
        , (protect(bind(ref(tarai), _3 - 1, _1, _2)))(_1,_2,_3)
        )
      );

  std::printf("tarai => %d\n", tarai(12,6,0));
}
967デフォルトの名無しさん:04/11/25 05:15:37
マジでboostからlambdaはずして欲しい。
968デフォルトの名無しさん:04/11/25 05:19:26
>>967
使わなければいいのでは?
969デフォルトの名無しさん:04/11/25 05:20:42
俺が使わなくても他のやつが使うじゃん。
俺そんなの読むのヤだよ。
って実際lambda使ってるやつ見たことないけど。
970デフォルトの名無しさん:04/11/25 05:29:16
勝手だなぁw
971デフォルトの名無しさん:04/11/25 05:36:02
lambda を馬鹿みたいに多用する奴がアホなだけだからなま暖かく見守っとけば?
972デフォルトの名無しさん:04/11/25 05:59:39
boost自体がお遊びでしょ
973デフォルトの名無しさん:04/11/25 06:03:47
boost見てると
「でっきる~かな、でっきる~かな♪」
と聞こえてくるんですが。
974デフォルトの名無しさん:04/11/25 06:08:04
>>973
「さてさて、ふふ~ん」ってか
975デフォルトの名無しさん:04/11/25 08:11:21
ほんとうに聞こえてくるなら病院に行ったほうがいいかと。
976デフォルトの名無しさん:04/11/25 08:19:19
C++にlambdaがないのがいけないんだよ。
Perlにすらあるのに。
977デフォルトの名無しさん
lambdaは予約語だからな。使わないようにしておかないと。