【C++】template 統合スレ -- Part5
重複。
Boost C++ Libraryプログラミング…3点
重複じゃなくて番号間違えです。すいません。
で、どっちなんだろう
こっちが本スレ
11 :
デフォルトの名無しさん:04/08/03 19:24
age
age
13 :
デフォルトの名無しさん:04/08/06 08:11
hage
そろそろ相談室に統合でいいんじゃねえの?いくつもいらんだろ。
>>14 スレの流れ的には問題ないと思う。
ただ、今あるスレ建てテンプレを相談室のテンプレにそのまま追加でよいのかが気になる。
16 :
デフォルトの名無しさん:04/08/08 19:44
std::cout ってスレッドセーフなんでしょうか?
今まで使ってなかったんですが Effective C++ に「<stdio.h> ではなく <iostream> を使おう」
という記述があり力強く使うことを推奨してるんで使ってみようかな
と考えているんですが、その構造上どう考えてもスレッドセーフじゃない気がするんですが・・・
>>16 cstdioはスレッドセーフなの?
スレッドセーフじゃなくなってしまうであろう構造とは具体的にどこ?
>>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++にはいっていたやつ
でしか試してないんですが、別な環境だと大丈夫だったりするんでしょうか
ちなみにソースはこんな感じです
(実験用コードなんで無限ループさせてるのは平にご容赦)
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-の話のどこにどう関係有るの?
すまんついでに行っとくが、スレッドセーフかどうかは排他をかける対象を
いつからいつまで使いたいのか考えればすぐわかることだよ。
>>27 標準出力に対する排他とコードがスレッドセーフかどうかを混同するなってこと。
こんなこともわからないようならプログラム書くの辞めたほうがいいよ。
あーぁムキっちゃった・・・
>>26,
>>28 たとえば、
排他をかける対象:標準出力
いつからいつまで使いたいのか:プログラム起動から終了まで
これだけの情報で「スレッドセーフかどうか」が「すぐわかる」と言うのか?
そんなわけないだろ。
>>26の意味が
>>28だっていうのも、飛躍しすぎじゃない?
「コード」「排他」「スレッドセーフ」の意味が
それぞれ曖昧なままなのが噛みあわない原因だと思う。
定義1:coutが呼ばれてる間、出力画面を壊さないことが保証されていることをスレッドセーフという。
定義2:coutが呼ばれてる間、バッファを壊さずに安全にメソッドを実行できるることをスレッドセーフという。
さぁどっちだ。
「coutが呼ばれてる間」ってなんだよ?
すまんな。 operator << でいいか?
でとっちなんだよ。
>>33 あのな、定義ってのは既に定義された言葉で組み立てないと意味がないんだよ。
雑談だから多少は大目に見るとしても、
「画面を壊す」「バッファを壊す」それぞれの意味くらいは
もうちょっと説明してもらわないと、エスパーにしかわからないよ。
ひとことも「スレッド」が出てこない「スレッドセーフ」の定義も、たぶん無理だと思うし。
だいたい「スレッドセーフ」なんて言葉は文脈によって変わるから、
話す人がきちんと定義しないと会話にならない。
相手に決めさせていいものじゃないはず。
>>16-の流れでのスレッドセーフとは、
シングルスレッド環境における一回のoperator<<呼び出しによる出力結果を「正しい出力」として、
マルチスレッド環境においてそれぞれのoperator<<の呼び出しに対して、
「正しい出力」が互いに割り込まれずに得られること。
という感じでいいんじゃないだろうか?
つーか、iostreamやprintfでどういう順番で表示されるかなんてOSの標準出力の仕様だと思うんだが。
>>34 同意。
ついでに
>>16の質問を
「std::cout ってスレッドセーフなんでしょうか?」
ではなく
「std::basic_ostream<> ってスレッドセーフなんでしょうか?」
に修正しておいた方がいい気がする。
これでもけっこういい加減ではあるが、だいぶましかと。
どこまで安全かよく考えろってことでよろしいでしょうか?
>>38 だから、それじゃエスパーにしか伝わらないって言ってんだろ。
もうちょっと自分の文章を客観的に見直してから書き込め。
それができないなら、もう寝たほうがいい。
書き込みに現れていない筆者の意図でも正しく読み取ることができる超能力者。
それでは
>>38の書きこみに現れてない意図とな何ですか?
まず、coutの仕様として
あるスレッドがあるバイト列を突っ込むとその通りの順序で出力される、
ということしか決めてないんじゃないの?
operator<< 1回を単位として出力とか、そんなことはわからないんじゃない?
で、スレッドセーフ性は、複数のスレッドから任意のタイミングでcoutにアクセスしても、
こけたりせずに上の仕様を満たした正常動作を行なう、というだけなのでは。
>>18の出力って別にブッ壊れてないよね。
適当にマージされてるから画面は乱れるけど、1つのスレッドが出してる出力に関しては正しい順序で出てるじゃない。
それをスレッドセーフじゃないと言うのは自分にはかなり奇異に映る。
16の期待する動作がしたいのだったら、ロックとflush()を使って
何とかせよ、ということだと思うのだけど。
>>43 >で、スレッドセーフ性は、複数のスレッドから任意のタイミングでcoutにアクセスしても、
>こけたりせずに上の仕様を満たした正常動作を行なう、というだけなのでは。
ここでいうところの「こける」とは何?画面出力が乱れること?それともプログラムが異常終了するってこと?
>>44 未定義動作に突入しない、仕様通りの動作を行なうことを「こけない」と表現してます。
こける動作の代表が異常終了だけど。
画面出力が乱れるのは仕様通りですよね。
STLPortもok
スレッドローカルの関数 : unique.c_str()
親スレッドから渡されたもの : unique
おまえもう良いから消えナ
すまん。きえるわ。おやすみ。
ちょっとまて。c_str()の動作はどうなんだ。
リテラルを出力するとどうなる。
>>51 何を心配しているのか知らんが、もう寝ろ。
当たり前だろ
何が?w
まことに申し訳ございません。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でつ! おまい時代遅れでつ!
>>67 宣伝も良いけどさ、踏み込むならスレ統一しろよ
sinhpってはいぱぼりっくかと思った
いや それだけですが
>>68 現状では宣伝できるほど整備できてないんでアレですが。まだ公開もしてないし。
浮動小数点とテンプレートという普段はあまりリンクしないであろうトピックに跨ってるのでどっちに絞ったものか。
個人的には浮動小数点演算の実装としての側面はあっちで、
テンプレート・メタ・プログラミングの例としての側面はこっちでと思っているのですが。
71 :
デフォルトの名無しさん:04/08/12 18:01
>>70 別に貼らなくていいよ。無職なんだろ?悪い事はいわんから他の業界目指せよ?
>>71 誤解のないように言っておくと
まぁ求職中なのはハンドルにも書いてるとおりで本当だけど今回の話題とは別に関係ない。
単に自嘲的に名乗ってるだけ。
そもライブラリも自分で使うつもりで作ったけど別に商売目的で作ったわけではないしな。
このスレに書いたのは純粋にテンプレート・メタ・プログラミングで
浮動小数点演算を使えるようにする話がしたかったからであって
別段宣伝したいわけではないよ。
>>72 ageた上、ああいういい方する奴は
無視でOK
自嘲ハンドルってウザイよな。結局主張してるわけだし。
自嘲したけりゃ部屋で一人で勝手にしててくれって感じ。
>>62 >ちゃんと整備したら使う人いそうかな?
います。で?
>>72 >浮動小数点演算を使えるようにする話がしたかったからであって
(´-`).。oO( 空想科学だろう… )
>>70 それってさ、
double d = 0.707; // means sin(pi/2)
って書く代わりに
double d = STATIC_SIN(3.14/2);
みたいに書けるから、ソースの可読性が上がるってこと?
それとももっと良い使い方があるの?
>>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のことかー!!
洩れは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
具体的にどのようにビルドできないのか教えてもらわん事にはどうしようもない。
コンパイラが見つからないのか、コンパイルでこけるのか、リンク時に失敗するのかとか。
あとエラーメッセージも。
>>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
というか,標準のコンテナに食わせられるAllocatorはインスタンス毎に固有の状態を持てない,
要するにローカルなメンバは持てないという結論になります.
何故こんな厳しい制限を要求する必要があるのかについては例えば「Effective STL」の第10項が詳しいです.
130 :
デフォルトの名無しさん:04/09/03 01:11
>>128 なぜアロケータを作るのかといいますと、某APIのメモリプールを使いたいからなので、
deallocateは常に成功します。(実際にはなにもしないので)
>>129 それで得た知識を伝授して頂ければありがたいのですが、そうくるなら、読んでみます。
>>127 rebindされたとき、データメンバはどうなるの?
>>130 秘密にされると気になる。
某APIってコレクションとかの話?
templateって、他のクラスのメソッドを呼ぶ時staticにしないといけないので
使いづらいな。型にハマると楽なんだけどな。
>>133は、Modern C++ Design のポリシーあたりか。
あの本ってポリシーを継承してなかったっけ
だから?
あなにもチェルシーあげたい
あなたにも だった or2
「Modern C++ Design」はどれくらいで
「Ancient C++ Design」になるの?
それとも、すでになってる。
モダン焼きがエンシェント焼きになる頃
143 :
デフォルトの名無しさん:04/09/13 09:07:08
VC++. NET 2005 (β版)ってtemplateのネストや
部分特殊化はokなんでしょうか?
自分で試せよ
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もそうなってるし。
deque の実装に配列の配列を使うと書いてある本があるんですが
実際どうなんでしょうね?ていうかどうやるんだろう…
リングバッファを一つの配列じゃなくて、
複数の配列で実現してdequeにしてるんでしょ。
一つだとサイズを拡張しにくいから。
というか他にどうやってやるんだ…
>>146 gccやSTLportのソース読めば?
あの実装はソースを実際読んでもらうか,あるいは説明するなら絶対に図が必要だ・・・
>147
GCCのはリングバッファじゃないですよ.
前方にも未初期化なバッファを確保するvectorのイメージが近いです.
というか配列の配列を使ってるのって単に効率化のためだけで,
別にdequeの本質的な部分(前方に定数償却で挿入できる,など)には
全然関係ないような気がするんですけれど,どうなんでしょう?
STLのコンテナって鼻毛が伸びるほど便利ですね。
鼻毛のほうが便利だけどね。
>151
どういう便利な使い道があるのか教えて
>>152 あえて意識して使うまでもないだろ。
日頃からどれだけのたくさんの不純物を
シャットアウトしてくれてると思ってるんだ。
その時点でSTLより上。
その通りだな
155 :
デフォルトの名無しさん:04/09/15 11:36:03
random_shuffleで、RandomNumberGenerator指定しないとランダムにならないのは
仕様なのでしょうか?
あと、RandomNumberGeneratorは自分で作成しないといけないのでしょうか?
>>155 「ランダムにならない」が、「プログラムを複数回起動しても
同一の並べ替えが起こる」を意味すると仮定して回答する。
random_shuffleは乱数生成器としてデフォルトでstd::randを使うから、
毎回違う結果がほしければ、random_shuffleを使う前に毎回違う値でstd::srandを呼ぶべし。
/dev/randomから引っ張ってくればいいんじゃない?
/dev/randomは重いじゃない?
責任を他になすりつけられればそれでOK
∩___∩ |
| ノ\ ヽ |
/ ●゛ ● | |
| ∪ ( _●_) ミ j
彡、 |∪| | /devは重い
/ ∩ノ ⊃ ヽ
( \ / _ノ | |
.\ “ /__| |
\ /___ /
ギャップバッファが理解できません
頭悪いですね
>>155 大抵のOSの大抵の言語の大抵の処理系では、
srand 相当のものに同じ seed を渡すと(あるいは srand 相当のものを使わないと)
乱数を使うと毎回同じ数列が返されるようになってます。
乱数を利用するプログラムを作るとき、実行の度に違う値がでてると、
単体テストやらアルゴリズムの効率の比較やらプロファイリングに基づいた
チューニングとかしにくいから。
164 :
デフォルトの名無しさん:04/09/16 21:32:35
rand使わずmt使え
>>164 当然 mt でも事情は同じ。っていうかこれは利点なんだけど・・・
166 :
デフォルトの名無しさん:04/09/17 09:56:04
> 乱数を利用するプログラムを作るとき、実行の度に違う値がでてると、
> 単体テストやらアルゴリズムの効率の比較やらプロファイリングに基づいた
> チューニングとかしにくいから。
あたかもそれを理由にそのような仕様にしたといわんばかり
しかし実際は疑似RNGから導かれる当然の結果に過ぎない
因果の誤解は思考力の不足を証明する
>>166 API的は、seedを自動で、って選択もあったんじゃない?
# 例えば、大昔のMS-BASIC
渡すようにしてるのは、
>>163にある理由もその一つでしょ。
>>166 俺は163じゃないけど。
それを理由にそのような仕様にしたんだよ。srandの規格を嫁。
でもrandがグローバルだから使いにくいけどね。
>>166 それを理由にそのような仕様にしたんだよ…
線形合同法の疑似乱数生成期に同じ種を与えれば同じ乱数列を吐き出すという現象は
「単体テストやらアルゴリズムの効率の比較やら
プロファイリングに基づいたチューニングをしやすいように」
という人間の要望から発生した?
人間の要望に応じて数学的現象が定まるのはおかしいな。
ピタゴラスの定理は誰かがそれを望んだからそうなったと言うタイプはどこにでもいるが。
172 :
デフォルトの名無しさん:04/09/17 11:29:00
>>168 > それを理由にそのような仕様にしたんだよ。srandの規格を嫁。
163を翼嫁
「srand相当のもの」だ
疑似RNG全般についての話
疑似RNG全般の性格をその一部であるsrandの規格から規定するな
>>172 スレ違いの上にウザイから下げて書けヴォケ
>>171 こういう、知識は豊富だけど頭が悪い人、っているよね。
アルゴリズムの話からAPI設計の話にすりかわった?
>>176 はじめからAPIの話だと思ってました。
>>166 MS BASIC はかなり初期のものから RANDOMIZE で seed を与え(られ)る仕様だよ。
実行毎に自動的に seed の初期化はされないけど、それは変数の値も含めて
全ての環境が残るっていう BASIC インタプリタの特性をひきずってるから。
>>171 処理系(ライブラリ)が勝手に seed を変えたりはしない、というAPI の仕様の話をしてます。
だって発端が
>>151 だし。んで一般アプリケーションはどう振舞うべきかというと
>>156 で
回答が出ているわけで、なんとも終わった話であることであるなぁ・・・
>>177 アルゴリズムの話からAPI設計の話にすりかえて
そのあとAPI設計の話からAPIの話にすりかえた?
182 :
デフォルトの名無しさん:04/09/17 15:56:33
>>181 アルゴリズムって、STL用語で言うところのアルゴリズムのこと?
ごめん。ageちゃった……。100回種付けしながら反省してきます。
ていうか
>>163 よ
> 大抵のOSの大抵の言語の大抵の処理系では、
> srand 相当のものに同じ seed を渡すと(あるいは srand 相当のものを使わないと)
> 乱数を使うと毎回同じ数列が返されるようになってます。
この前半部分は「大抵のOSの大抵の言語の大抵の処理系」と言ってるように
特定の言語の特定の規格について言ってるわけではなく
一般的に使われている線形合同な疑似乱数アルゴリズムの特徴について解説してる。
> 乱数を利用するプログラムを作るとき、実行の度に違う値がでてると、
> 単体テストやらアルゴリズムの効率の比較やらプロファイリングに基づいた
> チューニングとかしにくいから。
この後半は一見前半を受けて前半部分の理由を書いてるように見えるがそうではなく
Cの規格に含まれるrand/srandがなぜ線形合同な疑似乱数を採用したかの理由となってる。
話の展開がちぐはぐ過ぎだ。
これじゃ疑似乱数アルゴリズム全般の話題だと解釈する人も出てくるし
Cのrand/srandに特化した話題だと解釈する人も出てくる。
163の話の真中でアルゴリズムの話から規格の話に脈略なくすりかわってるということ。
(1)特定のアルゴリズムを使うとなぜそのような結果になるのかという理由
(2)特定の言語の規格がなぜそのアルゴリズムを採用したかという理由
>>155からアルゴリズムの話になってる最中に
(1)のふりをして(2)を書いたから人によって話題の対象がばらばらになり
アホレスが連鎖したってことかな
186 :
デフォルトの名無しさん:04/09/17 16:17:34
モリフォーリズムに該当するページが見つかりませんでした。
流行だったのか。Javaスレでも書いてあった。
モリモリタベヤサーイ
163=167=168=169
まずこのポリホの日本語をなんとかしてくれ
>>185 漏れは 163 なんだけど、
>>155 を「なんで適当に seed を毎回変えてくれないの?バグ?仕様?」ってな風に読んじゃったわけ。
seed が同じ擬似乱数なら毎回同じ系列が出てくるのは自明だとおもったんで。
んで、なんで毎回適当に変える仕様になってないか、を説明してしまった。
変わらないことが必要なことはあるし、変えたいなら自分で変えられるし、と。
えーと、163=178=179=192です。
俺は163じゃないんだけど
とやかく言う前にsrandの規格書を読め
srandの規格を読んだことない厨が知ったかぶりしてるだけでしょう。
頭悪いのバレバレ。
>>166 乱数の仕組みの話題だと勘違いしているようですが、
最初からAPIの話題です
>>163の前半は採用されてるアルゴリズムはこうですよ、という説明、
後半はなぜ採用されたのか、という説明。
なのに、
>>166は後半をアルゴリズムがそうである説明だと誤解したわけだね。
なぜそんなありえない誤解の仕方をしたのかは解からないけど、
酔っ払っていたのかもしれないし、頭のおかしい人が沢山いる環境で生活してるのかもしれない。
あんまり攻めてやるな。
163ではありませんが、
163はアルゴリズムの話ではなくて、発端からAPIの話題のつもりです
>>166も仕様の話じゃん。
擬似RND以外に選択肢が無かったみたいなことを言いたかったんじゃないの?
163の前半はC言語の規格が採用したアルゴリズムを説明。
後半は採用した理由。
だから163は間違ってないということでファイナルアンサー?
203 :
デフォルトの名無しさん:04/09/17 22:20:26
APIって言葉がたくさん出てきてるけど
ここではどういう意味で使ってるんですか?
みんなばらばらのように見えるんですが
APIはAPIだべ
205 :
デフォルトの名無しさん:04/09/17 22:25:27
APIとはsrandの規格のことかな?
そもそもseedを必要としないほうがいいなら、API内部でseed作るっつーの。
templateを利用することによってDIPが
よりよく実現されると言えるかな?
API を外部に持たせてるのは seed 設定できる理由のためですよ。
複雑になるだけでそれ以外メリットないし。
163じゃないが
163を分かりやすく言い直すと次のようなもの
・ほとんどの言語や処理系では乱数に疑似乱数を使っている
・疑似乱数の場合 srand のような seed 設定できる関数に seed を渡すと毎回同じ数列が返る
・さらに srand のような seed 設定できる関数を使わない場合も毎回同じ数列が返る
・なぜそういう結果になるかというと、実行の度に違う値がでてると不便だから
・不便というのがどういうことかというと
単体テスト・アルゴリズムの効率の比較など
プロファイリングに基づいたチューニングとかしにくい
>>171で
・・・という現象は・・・という人間の要望から発生した?
と書いてあるからこいつが誤読してる。
現象が発生したのではなく、仕様が発生したとみんな言ってるだけなのに。
>>207 のDIPって設計原則のDIPのこと?
DipendencyなんたらPrinciple?
STLのイテレータはDIP的に考えると、すべてランダムアクセスであるべきだと思う。
DipendencyじゃなくDependencyだったよ orz
DIPはせまく読めば古典的なOOデザインだが、Policyなんか
先に生まれたライブラリがあとから提供されるものに依存する、
という点では立派な依存関係の逆転。
「163じゃないけど」と名乗る人が
短時間に似たようなことを沢山書くのが流行デスカ
216じゃないけど
そうみたいです。
>先に生まれたライブラリがあとから提供されるものに依存する
>先に生まれたライブラリがあとから提供されるものに依存する
>先に生まれたライブラリがあとから提供されるものに依存する
んなことできるかボケ
依存という言葉を聞きかじった厨房が
知ったかぶりに使ってるだけなんだから
許して上げてください
219 :
デフォルトの名無しさん:04/09/18 18:07:06
163やあれへんのが、きょうびのステータスや、われ
ライブラリが何らかの引数をとれば、一応そのライブラリは
後から渡されたパラメータに依存していることになる。
その引数が単なる値じゃなくてポリモっぽいものであれば
アルゴリズムその他は後から提供されたものに委ねるという
パターンがとれる。
じゃあテンプレートパラメータの場合は?
通常(メソッドや関数)の引数としてに何かを受け取る場合
と違い、アルゴリズムだけじゃなく自分自身の構造まで依存
できる。
ポリシーの多重継承で実装されたホスト・クラスなんかはそう。
>ポリモっぽいものであれば
インターフェイスに依存している
>テンプレートパラメータの場合は
同じ
依存関係を逆転、ってのは何らかの決定を遅延させる
ことによって再利用性を高めるのが目的。
インターフェイス、データ構造、アルゴリズムのうち
どれかは最初に規定しておくが、その他は後から提供
できるようにしたい。
普通のOOの場合はインターフェイスが規定されていて
アルゴリズムは後付けOK。
テンプレートの場合は?同じじゃないよね?
>>222 テンプレートは同じインターフェイスのものをまとめるものだから、
インターフェイス重視という点ではすごくDIP。
特定のインターフェイスを継承しなけりゃならないのはうざ。
ホストクラスが使う限りのメソッドを、コンパイルが通るシンタックスで
用意しておけばOKとなれば、そこで(ベースとなるインターフェイスとの)
依存関係が切れてウマー
インターフェイス(クラス)との依存は切れるけど
使ったメソッドなどのインターフェイスとの依存を切る事は出来ないよ。
そりゃそうだ。つーか当然
>>222で書いたインターフェイス、データ構造、アルゴリズムなどの
要素について、どれに対する依存を残してどの依存を切るかtemplateを
使うと選択肢が増えると言いたかった。
222は依存という言葉を間違えて使ってるとしか思えない
他にも日本語おかしいが
最近Boostを使い始めたんですが、Boostの知名度というか認知度というかそういうのはどうなんでしょうか?
例えば配列の代わりにvectorを使用してて怒られるといったことは(特殊な環境を除いて)ないだろうと思いますが
ポインタの代わりにshared_ptrを使うというのはあまり推奨されないものなんですかね?
>>229 auto_ptrで済む所をなんでもshared_ptrにするのはどうかと思いますね
>>230-231 どうもありがとうございます。
>知らないやつが勉強不足。
うちの教授(プログラムの専門に非ず)に「標準じゃないけど使って大丈夫なん?」的な
ことを言われたんでちょっと使うのが不安だったんですが、使っても良さそうですね。
>auto_ptrで済む所をなんでもshared_ptrにするのは
そこら辺も注意してやっていきたいと思います。
それにしてもまだあまり参考書が出版されてないみたいですね。
やはりSTLへの採用待ちですか…
>>232 教授は単に君の勉強不足を不安視したんでは。
使っても大丈夫かどうか2chで聞くくらいだから。
234 :
デフォルトの名無しさん:04/09/19 21:32:29
>>222はStrategyとかのことをいってるんちゃう?
>>232 STLへの採用ってあるのかな?
BoostはBoostとしていつか標準化されるんだと思ってたけど
>234
STL(というか、C++標準ライブラリ)への採用は結構マジ話らしい。
聞きかじりだけど、boost::iteratorsあたりで使われているイテレータの分類なんかは
もう次期C++への採用は内定だそうで。
function, tuple, type_traits, regex, mem_fn, shared_ptr, ref, bind は
次期C++標準に含まれることが決定しているそうな
次期ってまだこのポンコツ言語を引っ張るつもりなのか・・・
function や bind を標準装備しないまま引っ張る方がよほど困るわ
>>232 boostはSTLと同じくらい標準だよ。
それぐらいSTLは使われてない。
実装がひとつしかない分、boostのほうがまともかもしれない。
>>239 >boostはSTLと同じくらい標準だよ。
>それぐらいSTLは使われてない。
意味不明すぎ。STLは標準でboostは標準じゃない。
>boostはSTLと同じくらい標準だよ。
>それぐらいSTLは使われてない。
分かりやすく
242 :
デフォルトの名無しさん:04/09/20 00:25:49
ある意味笑うところかも
243 :
デフォルトの名無しさん:04/09/20 00:39:20
マジどころかそれを目的にやってきたのに
「結構マジ話らしい」言われちゅゃおうところが情けな
あげるな
hash_mapはboostより標準ですか?
ちゃいます
>実装がひとつしかない分、boostのほうがまともかもしれない。
これは的を射てますね
つ~かboostの中の人はSTLに依存しないコードを書いちゃってくれたらいいのに
と思いますよ
sgiと組み合わせるとボロボロ
結局preprocessorしか使えない
lexical_castすら使えないのには泣けました
stlport使ってくだはい
stlportということでちょっとついでに込み入ったこと聞きたいんですけどいいですかね
とあるハードウェア用のAPIを使って書かないといけないんです
でそのSDKが既にsgi使ってるんですよ
#includeが<list>だったり<list.h>だったりして
そのライブラリのソースコードは提供されていません
SDKにはAPIのヘッダ達とユーザ側でリンクするオブジェクトファイル(.lib)と
sgistlのヘッダが含まれているんです
例えばVC++付属のstl使おうとするとコンパイルとおらないんですが
こういう状況でstlport使えるんでしょうか?
ていうか試して使えなかった記憶があるんだけどもし使える方法があるならかなり嬉しい
>>249 バイナリ提供部分とのインターフェースがsgistlに依存していれば無理。
そうでなければ、どうにかして置き換えられるはず。
もちろん、「どうにかして」の部分は実際に
その環境を持っているあんたにしかわかんないよ。
>>250 どうもありがとうございます
>バイナリ提供部分とのインターフェースがsgistlに依存していれば無理。
これってどうやったらわかるんですか?
というライブラリがsgiとスタティックリンクされてたら無理
っていう理解でよいでしょうか?
>>249 そのSDKはSGIのSTLのままでいいの?
stlportの名前空間を変えてリンクすれば?
>>252 はい
別にSDKがSGI使ってるのはかまわないです
>stlportの名前空間を変えてリンクすれば?
namespace stlport{
#include <stlport/list>
}
using namespace stlport::std;
とかで,stlportにもリンクすればいけますかね
これは試してない
いけたらすご~く嬉しい
重複スイマセン
↑の場合例えばboost側でstl使ってるところで
「sgiとstlportどっち使えばいいんだよ~」って言われちゃいません?
SDKのヘッダインクルードする前にboostインクルードすればいいのかな
むぅまぁ明日試してみます
>>249 ふつうにSTLport使おうとするとどうなるのかを言ってもらわないと、お話にならないね。
Modern本の『1.3多重継承で解決できるのか?』
の3番目にある状態の操作というところがわかりません。最初にある、
「基底クラスを用いて実装される様々な動作は、同じ状態を操作しなければ
なりません」のとこからいきなり意味不明。
1や2は理解できてんのか?
>>253 STLportはオプションで_STDかなんかそんな名前空間に切り替え
られるはず。
で、それでboostコンパイルが…できるかどうかは、今C++の環境が
すぐに出せないから答えられん。。。boostオプション見てみて。
>>258 ありがとう
多重継承や仮想継承については大体知ってるんだけど、あの内容と
どうつながるのかわからないっす
飲みすぎでレス遅くなりスマソ
>>257 わーてるよ\(`Д´)ノ
>>260 あの本の中じゃテンプレートを使用しないとどんなことになるのか
例示されてないからイメージ沸きヅラいかも
>>261 あぁ。そうだな。
飲みすぎには注意しろよ。
(・∀・)ジサクジエンデシタ
一ひねりしろ
>>256 『状態が保持されている基底クラスを継承するには』という条件が付いて
ますよね?必ずそうしなければいけない訳ではないので仮想継承うんぬんはあまり
気にしなくていいのではないかと。
むしろ『ユーザ・クラスはライブラリ・クラスを継承するものの、その逆は許されない』
という注意点と、前のページの下のほうにある『設計とは、制約を課す作業のことです』
以下の文章をよく読み比べてみて下さい。
このスレを通り過ぎて来たらstlportさんの話がちらほら聞こえてきた。
あぁ、stlportさんをまだ君を大事にしてくださる方々がいるのですね。
僕は、今でもあの時、君と出会った感動を忘れないよ。
今では、僕が君とは交じり合うことは無くなってしまったけど。
どうか、stlportさんとお付き合いを重ねている方々・・・。・
末永く僕の分まで一緒にいてあげてください。
._,,,,,,,,,,,,,,,,,,,、 _ ___ ,,,,,,,、
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
_| ̄|.............○))
>>158 seed だけ /dev/random から持ってくれば良いじゃん。
270 :
デフォルトの名無しさん:04/09/26 22:53:42
>>269 そんなことするならいっそurandomで
すいません、素人質問なんですが。
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)です。どなたか教えて下さい。
>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
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
>>274,275
ありがとうございます。ちょっとこれから出先なので、今日中に試して報告します。
駄目でした・・・
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 が未解決です。
とエラーが出ます。もう何が何やら…
もう数日試してみて、駄目なら諦めます。成功したら書き込みますので、
消えたら駄目だったと思ってください。
>277
多分、STLPORT_*の設定がうまく行っていないせいだと思う。
そのせいで、STLportを使わずにVC6のSTLを使っちゃってるんじゃないかな。
生成されたDLLファイルを覗いてみて、エクスポート関数の返り値や引数の型に
std::ってついていたら確実にそのミスなんだけど、確認の方法を知っていたら確認してみてくり。
具体的に、環境変数STLPORT_*を何に定義したのか晒してほしい。
>274 のcppllの記事の中で出てたこのURL読んだ?
ttp://hw001.gate01.com/eggplant/tcf/cpp/boost_build.html
>>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: ブロ
ックが大きすぎて、コンパイルできません。
とエラーが出るようになりました。
とりあえず、午前中はこんな感じです。
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
できれば名前付きキャプチャもサポートしてホスィ
>>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様、ありがとうございました。
283 :
281: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");
}
284 :
283の修正: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
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です。
std::ptr_fun(std::strcmp)
>>286 レスありがとうございます。やってみましたがダメみたいです・・・・
同じようなエラーが出ました。
>>285 それだと、ソートアルゴリズム中で
// x, y 番目を入れ替え
tmp = str[x];
str[x] = str[y];
str[y] = tmp;
なんつーコードに展開されるからダメでしょ。
char const* str[] = { "abc", "def", "ghi", "jkl" };
とか std::string の配列にすれば OK だと思うが、どうよ?
>>288 やっぱりそうなんですか。std::sortには比較関数しか渡せませんからねえ・・・・
std::sortに交換関数も渡せればいいのですが。
でも、教えて頂いたように書き換えてうまく行きました。ありがとうございました。
>>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見たのでうまく表現できん。。。
>>290 あーそっか。std::strcmpではまずいですね。どおりで結果が変だと
思いました。そしたら叙述関数か関数オブジェクトを外部に作ります。
配列のコピーはどうやったらできるんでしょうか?std::sortには渡せ
ないんですが・・・風呂入って来ます。
>>291 一年近くSTLさわってないんではずしてたらすまんが
コピー可能なイテレータ作ればいいんじゃねぇの?
配列のコピーがサポートされてたかどうかは忘れたけど、
それくらいテンプレート関数使えば簡単に出来るんだからサポートしろって感じだけどな。
以来彼の姿を見たものはいない・・・
>>292 イテレータの自作ですか。代入演算子やコピーコンストラクタを配列に対して
定義するしかないんですね。ちと残念ですがまだそこまで私の実力が伴わない
ので諦めます・・・・
しかし qsort() に出来て std::sort() だと簡単にはできないというのが悔しい・・・
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; }
// 続き
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;
}
>>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));
結局,char[10]はAssignableでもCopy Constructibleでもないため
sortに突っ込むこと自体間違っている,ということで良いですか?
>>297 (゚д゚)ウマーなんですが,reinterpret_castはなるべくなら最終手段にしたいですね.
というか,そうするなら初めから固定長文字列ラッパ使えば良いような・・・.
boostでようやくfixed_stringがレビュースケジュールに入ったので
将来的にはそれを使えばさらに(゚д゚)ウマーになるんでしょうかね.
>>299 reinterpret_castは避けたいという気持ちはわかるが、だとしたらqsort() に出来て
std::sort() にできないことを悔しがる必要はないんじゃないか?
301 :
デフォルトの名無しさん:04/10/01 16:06:00
boostスレを独立させようと思うのですが、皆さんのご意見をお聞かせください
独立させるほど話題もないし
仕事おそいし
構文きもいし
>>301 ますます閑散としてしまうような
むしろこことC++相談室の統合を考えたほうがいいような気がする
>>301 /\
/ ノ \,_;;,;;vv、;、
/ノ ,;; ;:;#ヽ や、やめてぃょぅ
i' "~'"" ヽ ここの客、盗らないで。
l ○ ○ i;
;; * υ u l
ヽ、 ゚ (_人__丿 ノ
/ `ヽ、__ ,ノー'"/;~;,ヽ
/  ̄"""゙ (;;,@';,)
ノ ヾ.,;,.∴ (´"~"" ∵
l ';,;@;';, ノ ;,.
| ;' ";~" / ;,.
閑散とするから統合したんだよな。
勝手にSTLスレ作ってる奴いるけど。
>301
ここで積極的にboostの話題振れば良いと思いますよ.
というか,仮にSTLスレの存在を認めるとすると
このスレにはtemplateの文法とBoostぐらいしか話題が残されていない・・・.
このスレも全部C++スレに統合でいいと思う
C++相談室は初心者隔離スレとして機能してるから、
せっかくのそれを破壊するのはどうかと思う。
あれは初心者隔離スレだったのかー!w
そして2004年10月、C++のスレは統一され長い戦国時代に終わりを告げた―――
――2004年11月、C++のスレは再び覇権をめぐり戦いを始める
マクロもテンプレートの一種だから
含めてもええよな?な?
いいわけねえだろw
そもそも分ける必要はなかった
最近boostが特にお気に入り。
でも、ちょっと待ったー。何じゃのこのサイズ、何じゃこの遅さ。
とはあまり気にしないのですが、でも確実にそれらと比べるとDelphiの方が優れているように感じてしまう。今日この頃。
だからと言って、やめられない。
このboostを使うと今まで書き続けていたC++のコードが気色悪いほどまったく別のものになる感じが。気持ちぃいいいいい!!
318 :
283の原因:04/10/02 16:00:41
boost::regex_searchが
boost::smatchを再利用したときに前の状態が
残ってる場合に284のような結果になるみたい。
だから
match.swap(boost::smatch());
をwhile文の最後に追加したら
ちゃんと動きました。
最近ム板が特にお気に入り。
でも、ちょっと待ったー。何じゃのこの厨房、何じゃこの痛さ。
とはあまり気にしないのですが、でも確実にそれらと比べるとマ板の方が優れているように感じてしまう。今日この頃。
だからと言って、やめられない。
このム板を使うと今まで書き続けていた煽りのレベルが気色悪いほどまったく別のものになる感じが。気持ちぃいいいいい!!
316を見て思い出したのだけど、boost::shared_ptrって遅いの?
最近知ってこれいいやとちょこちょこ使っているのだけど、
ぐぐったら論外に遅いとかいう意見がひょこひょこ出てくるもので。
じぶんでつかっちえるぶんにはきにならないのでつかうけどsぁええ。
>>320 実際にトレースして原理を調べてみれば良いと思う。
いつのタイミングでどんな処理をするのかとか。メモリをいつ、どれくらい使うかとか。
それで納得できれば使えばいいし、そうでなければ別なものを使えばいい。
参照については中に生のポインタを持っているのだから、普通のポインタと
多くの場合速度的には変わらないんじゃないだろうか。
>>320 さすがに生ポインタと比較すると遅くなる要素は大量にあります.
ただ,shared_ptrのオーバーヘッドは局所的なものなので,
(例えば参照はずしは321さんのおっしゃるとおり生ポインタと変わらないはず)
どこに余分なコストがかかるかを理解していればそれほど気にする必要はないかと.
また,このオーバーヘッドはnon-intrusiveな共有ポインタの実装としては
ほぼ不可避なものばかりですし.
参照はずしは生ポインタの6倍ってどっかに書いてあったような気がするけど。
>>323 今ソース読んでみましたけれどそんなオーバーヘッドがかかる要素は
どこにも見当たりませんでしたよ?324さんの言うとおりとか・・・
あと設定によってはassertが入るのかな。
shared_ptrって一度普通のポインタに格下げしてからもう一回shared_ptrに突っ込むと、
別々の参照カウンタを参照するようになって狂うんだよな。
普段は気をつけてりゃ良いけど this だけはどうしようもないから困る。
被参照オブジェクト内に参照カウンタを持たせるとか、
new に細工して頭に参照カウンタを埋め込むとか、
被参照オブジェクトに多少制限を加えることで解決出来る方法はあると思うけど、
そういう実装は無いの?
>>327 boost::intrusive_ptr
boostみなおしたよ(´-`)
亀レスすまそ。
>>290のstrcmpの戻り値以外の話は全て忘れてくれ。。。
なんか全然間違ったこと書きまくっていたことに気づいた。。。
orz
配列コピーなんて全然サポートされてないし、引数も問題なく渡せるはずだし。。。
そもそも半年以上まともにC/C++いじってないどころかネットもまとも
につなげられない場所なんで。。。
半年でここまでアホになれるんだと痛感してしまった。。。
やっぱり継続は力なりだな。
もうオレって( ´,_ゝ`) プッ♥
引数に配列を渡すだけでその配列中の最小値を出せる関数ってどうやればいいでしょうか?
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の要素数をコンパイルタイムで入れられなくて行き詰まっています…
>>332 template <typename T, unsigned N>
T min_element(T (&ary)[N]) {
return std::min_element(&ary[0], &ary[N]);
}
>>333 - return std::min_element(&ary[0], &ary[N]);
+ return *std::min_element(&ary[0], &ary[N]);
>>333 感動しました!
ありがとうございました!!
Qtのsignal/slotが好きだったのでboost_signals見つけて嬉しかったのだけど、
コレとlibsigc++の両方使い比べた人の感想とか聞きたい気がしたようななゆゆゆ
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;
}
これじゃいかんの?
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;
}
ダメなんじゃない?いや、たぶん
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系で何かありそうなんですが、よく分かりません。
>>341 std::vector< unsigned char > じゃ不満なの?
343 :
デフォルトの名無しさん:04/10/06 18:52:31
えー、簡単ってのは<<の演算子で追加できるようなやつです。
vectorならpush_backで追加できるが。
std::vector<unsigned char>& operator<<(std::vector<unsigned char>& v, unsigned char c)
{
v.push_back(c);
return v;
}
>>346のやり方で、
unsigned charじゃなくて、unsigned charの配列を追加するには
どうしたらいいんでしょうか。
要素の長さだけforで繰り返すんですか?
>>347 どうしても<<がいいのか?
STLには
std::copy( a, a+n, std::back_inserter( c ) );
という決まり文句があるんだが。
vector なら copy じゃなく insert 使えやボケ
350 :
デフォルトの名無しさん:04/10/06 20:03:01
Ruby ?????????>>>>>>>>>>>>>>>>>>>>>>>>> C++
back_inserterは内部でinsert使うと思うんだが。
v.insert(v.end(), c, c+n);
ってことじゃね?
>>344 そういうのならstringstreamはどう?
もちろんそのunsigned charの配列が'\0'終端されていないと無理だよ。
別スレで紹介されてた↓
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);
の結果が変わるなんてまったく知らなかったーよ
12へぇくらいかな
>と書くのじゃ順番が違うだけなのに
順番が違ったら大違いだと思うが。
>>351 back_inserter は push_back だよー
reserveしてからcopy、かな。
361 :
デフォルトの名無しさん:04/10/07 02:56:05
なんでもいいや
>>355 これVC6だとC2667, C2668が出る(´・ω・`)
どう違うんですか?
素でURL書いてあるの見えてなかった。
スマンカッタ
その前にVC6のテンプレートを期待してはいけない。
VC6のってANSI準拠じゃねーだろ
ANSI?
ANSI
ANSIより緊急連絡
メデー、メデー。
こちらVC6。本部応答願います。
ANSIタンハァハァ
ANSIタンのおかげで安心。
373 :
デフォルトの名無しさん:04/10/07 21:11:45
イテレータとポインタの違いを教えてください
iterator->iterator, proxy パターン
pointer->ただのポインタ
375 :
373:04/10/07 21:31:07
えーと、そういうことじゃなくて、
使う上で注意するべきことというか、
ポインタの代わりとしてイテレータが使えない場合があるのかどうか
聞きたかったんです。
>>375 イテレータはイテレートできてポインタとしても扱えるもの。
例えば、vectorならポインタもイテレータも同じだけど、
listだとポインタでイテレートできない。
こんな説明でいい?
↑バカ。
リストでも大抵list->next等でイテレートできるだろ
もろポインタ。
つーか辿る手段がないものをリストとは言わない
例えるなら集合とかにしとけ
>>377-378 話がかみ合ってないぞ。
ここはC++のtemplateスレだから377が言ってるのは、list.begin()で取れるイテレータのことだと考えた方がいい。
vectorの場合 vec.begin() じゃ無くて &vec[0] でも列挙できるが
listの場合 &list[0] はダメと言いたかったんだろう。
いや、あれだろ、std::つけろやってことだ。
>>375 ポインターと別物として考えてください。
イテレータの代わりにポインターは使えるけど
ポインターの代わりにはイテレータは使えない。
イテレータ⊃ポインタ
ってこった
>>373 例えば、STLコンテナのイテレータとしてクラスが使われている
場合は「--container.end()」は何も問題ないが、生のポインタが
使われている場合は「--container.end()」はエラーになる。
STLのイテレータは、
ポインタのインターフェイスで、
STLのコンテナ間の実装の差異を埋めるためのものでしょ。
じゃあ、全部ランダムアクセスにしろと。
>>384 歴史的な順番としてはそうかもしれないが、言語を作った側の
意図としては順番が逆なのでは?つまり、ポインタがランダム
アクセスイテレータの一形態に過ぎないという。
ポインタ=神
イテレータ=サーバント
サイズ
イテレータ>=ポインター
>>389 ランダムアクセスイテレータじゃないとポインタで代わりにならないよ。
>>393 実装によってはイテレータがポインタを保持しない場合ってのがあるの?
>>394 列挙対象がシステムで唯一なら何も持つ必要は無いし、
配列で管理されていればそのインデックスを持つだけでも良い。
ポインタはランダムアクセスイテレータコンセプトのモデルである
>>397 STLのイテレータの話(らしい)けど、STLのコンテナのイテレータの話じゃない。
>>394 ゼロレジスタみたいに、常に参照はがしするとゼロを返すイテレータとかも
ありだしね。理論的には。
>>385+
>>396 で考えると
RandomAccessIterator<T> : private T*{・・・};
OteraIterator : private T*{・・・} となるけど
T* : private RandomAccessIterator<T>, private OtherIterator<T>{・・・}の方がしっくりこない。
>>402 コンセプト同士の関係 (refinement) は、継承じゃ記述できんぞ。言いたいことは
分かるが。
「コンセプト」と「コンセプトのモデル」をごちゃ混ぜに語っている
人が多くて,どうにも議論が追いにくい・・・.
>403
コンセプトをインターフェースクラスとして表現した上で,
Refinementの関係をインターフェースクラス間の継承関係で表現できないですかね?
(昔この手の提案があったはず)
あとコンセプトのRefinementの関係を,コンセプトに1対1対応させたタグの
継承関係で表現する手法はありますよね.(iterator_categoryとか)
>>404 > Refinementの関係をインターフェースクラス間の継承関係で表現できないですかね?
C++ だと operator は継承できないし、できたとしても Assignable とかはクラス
としては記述しようがないかと。operator=() が定義されてることと Assignable で
あることは違うし (std::auto_ptr とかさ)。
>405
確かに,よくよく考えてみれば他にも例えばoperator+等は
メンバかグローバルか両方の可能性がありますしね.
有効式(Valid Expression)の要求が抽象的(構文が通るかどうか)過ぎて
インターフェースクラスで表現するには限界がありますね.失礼しました.
-有効式(Valid Expression)の要求が
+有効式(Valid Expression)のようなsyntaxの要求ですら
ましてやsemanticな要求は・・・ですね.
>>403-404 ああ。なるほど。どうやらみなさんと考えてる部分が違ったのですね。
すんません。ペコペコ
おめーら、stlsoftは使ってますか?
おらんだ
> C++ だと operator は継承できないし
てどういう意味?
>413 VC7.1付属MSDNライブラリより。
・All overloaded operators except assignment (operator=) are inherited by derived classes.
あと単項演算子はともかく、二項演算子はフリー関数にして friend 宣言することが
多いから、継承も何もないわな。
継承できない(しない)のはoperator=だけだろ
それとフリー関数で提供した場合は継承は関係ないが
"要求"は保存される
(コンセプトとは要求の集合である、という文脈で)
>>416 台風接近中
厨を晒してる場合じゃないぞ
>>414 なんか微妙に荒れてるが、俺の勘違いってコトで。ゴメンね。
# define BOOST_MPL_PREPROCESSED_HEADER apply.hpp
# include "boost/mpl/aux_/include_preprocessed.hpp"
この2行がすべてを無意味にする恐ろしいヘッダファイルであった。
因み環境vc7.1。
詳しく
>419
無意味になったのは「マクロの嵐を必死こいて解読した努力」ですか?w
いやなことでもあったの?
>マクロの嵐、
俺は洟から解読をあきらめた
>>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ヘッダの役目を終えてしまう仕組みになってたんでね。
421は煽りっぽく読めますね,すいませぬ.
>424
PP多用したboostのコード読むときは使っているコンパイラに
PPの結果だけ吐かせてそれを整形して読んだ方が速いですよ.
>>426 わざわざ助言ありがとう。
でも、実はすでにブリプロセスファイルを生成して確認をしてるんですよね。申し訳ない。
>>425 アイアイサー。
しかし、また書く時あるかも・・・・・あしからず。
( ゚д゚)ポカーン
プリプロセスをPPって書く人を始めてみました
cpp
Boost.PPって正式名称じゃないか?
$ cpp 429.cpp
434 :
デフォルトの名無しさん:04/10/13 14:00:15
str += "aiueo";
とは別の方法としての
std::string str;
str.reserve(6);
strcpy(&str[0], "aiueo");
は問題ない使い方でしょうか?
>>434 >&str[0]
こんなの渡すのは通常は問題じゃないの?
>>435 では(書き込み用に)文字配列(バッファポインタ)を要求するような関数に
std::stringを渡す事は出来ないのでしょうか?
参照カウンタで文字列を共有するような実装ならポインタ渡したらまずいですかね。
素直にstd::vector<char>とか渡せばいいのかな。
(とりあえず434はresize?)
書き込んだ結果途中で\0なんか入れられたら
訳分からんことにもなろうし
>>434 STLスレで見かけたんだけどstd::stringではstd::vectorと違い要素が連続していなくてもいいらしい。
そんなのありえないだろうけどやめとけ。
こーゆう話題がでるのでC++スレにこのスレとSTLスレは
もうそろそろ統合する時期なのかも。
Boostスレはまだ統合しなくてもいいけど。
>>441 そろそろ統合する時期っつーか、
C++とtemplateの2スレでやってきたところに
突然このスレが発生したわけだが。
>442
>>434の「reserve()」ってとこには誰も突っ込まないのか?
446 :
デフォルトの名無しさん:04/10/14 02:08:00
BorlandのBuilderとVC(MFC)で使っている
自作のクラスの中でメモリを確保していた部分を
vectorで書き直そうと思っているのですが,
互換性などは問題ないのでしょうか?
STLと一言で言ってもライブラリを作っているところは
いろいろあると書いてあったので.
>>446 > 自作のクラスの中でメモリを確保していた部分を
って何?
new char[] ?
規格通りにSTLを使って、規格通りのコンパイラでコンパイルするなら
問題ない。心配ならSTLPortでも使うといい。
>>447 自作のクラスAの中でクラスBの配列を動的にnewで生成してたんですが,
その部分をvectorで書き換えるとBの最大値を簡単に変更できて
便利だと思いまして.
すいません,449=446です.
>>449 そゆ事ならどんどんやってください。
最大値→サイズ
boost本のlambdaの解説にて疑問に思いました
for_eachのみ(無名関数)で頑張るために新しい文法(lambdaの)を駆使するより
普通に関数つくるかforループ回したほうがよくないですか?
最初のサンプルで簡潔に書けることを示している部分には同意しますが
例外処理してる部分なんてみにくいだけのような気がします
(こんなことも出来るよサンプルだとは思います)
私の理解不足でしょうか。
問題は、lambdaを無理矢理がんばって実装してることにある。
おとなしく言語仕様に加えろと。
おとなしくD言語に移行しろってことか
たしかにリファレンスを見ているだけで無理矢理感がつたわってきますね
関数内のローカル関数がかければ随分違ってくるのでしょうか
sortの比較にちょちょっと使う程度なら便利だよってことでしょうか
template 引数が外部リンケージ(でしたっけ?)を持たなければいけないという仕様はなぜ生まれたのでしょうか。
関数内のクラスをテンプレートに渡したいと思う場面は頻繁に発生します。
頻繁?
>>456 > template 引数が外部リンケージ(でしたっけ?)を持たなければいけないという仕様はなぜ生まれたのでしょうか。
おそらく、テンプレートがインライン展開されなかった場合のシンボルが重複しない
ように、だと思われ。
マクロを見ると鳥肌が立つのは俺だけか?
マ○○を見ると○○が立つのは俺だけか?
>>460 結局のところ、どんなに頑張っても…、という空しさが募るばかりです。
464 :
デフォルトの名無しさん:04/10/16 00:25:51
C++が糞であることの何よりの証拠だな。
さっさとRubyに移行しろ低能ども
珍宝
でも別に珍しくはない
正直、lambdaがあってもそんなに便利になるとも思えないんだけど
サンプルコードとかテストコード書くときはちょっと便利そうだけど
俺の理解が浅いだけかな
469 :
デフォルトの名無しさん:04/10/16 01:08:01
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>C++
>>468 > 正直、lambdaがあってもそんなに便利になるとも思えないんだけど
compose や bind をネストして書いてると、C++ のコード書いてるんだか
Lisp プログラミングしてるんだか分からなくなるぞ(w
>>468 知らないってのは哀れなことだ。
世界がC++で閉じてるんだろ?
しかもそのC++も十分使いこなしてないだろ?
>>471 lambdaが便利だという例を示してくれ。
可読性落としても分かりにくいコード書いて嬉しいか?
LispならともかくC++でlambdaって意味わかんね。
boost::lambdaの話なのか、lambda一般の話なのか解からないのは俺だけだ。
まなな?
でも、実際ラムダ使えねーけど。
整数にる内部足し算は可能なのに
(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);
こんなことやってらんないし。
>>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 の比じゃない。
俺いちいちファンクタつくっちゃうなぁ
その方がコンパイル速いし 可読性もあるし
if_とかwhile_を使った面白い例とかないの?
>>478 > その方がコンパイル速いし 可読性もあるし
コンパイル速度はともかく、可読性は慣れのような気がする。さすがに
boost::bind() を 3 つも 4 つもネストさせて合成関数作るようなコードは
アレだが、476 程度で「読みにくい」っつーことはあるまい。
>>477-479 Cをユーザー定義型として、friendのoperator+を持っています。
で、先の式の説明をいたしますと
C c(10), d(20), m(0);
(var(m) = _1 + _2)(c,d);
ラムダ式でmに代入をするという目的だけの式が作れないんですよ。
なんで?って感じでいまだに謎のままです。
>>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に挙げたドキュメントを参照してください.
>>484 おฺぉฺすฺげฺぇฺ〰ฺ
ってゆう前にごめんなさい。よく読んで無かったですね。
「Extending return type deduction system」もろですね。
lambda使わないと、ファンクタ一個作るために
構造体の定義書いて、さらにそこでしか使わないようなファンクタなら
無名namespaceで囲わなきゃいけないから面倒だし、
構造体の定義は関数中に書いてもテンプレート引数には渡せないから
わざわざグローバルなスコープに戻って定義しなきゃならん。
これだと読むときにも、いちいちファンクタの定義探すのが面倒なんだよね。
ただ、さすがにforループとか例外までlambdaで使う気にはなれんけど。
そこまでやるなら、関数に切り分けた方がいいと俺の構造的プログラミング勘が申しております。
C++の仕様って、STLに向いてないよな。
たとえ_1+_2程度でも俺は関数にする。
そこはケチるところではないと思う。
と半年Java漬けで毒されつつある俺は思う。
関係ないけど自作処理系でlambda使える様にした。
結局これはインラインで滞りなく書けることに意義があるんだよ。
boost::lambdaは実装者の自己満足でしかない。
仕事だと、まず C/C++ であることに意義がある場合が多いわけだが。
実用言語に非実用的なライブラリは要らない
使わなきゃいいじゃん……
boostみたいな準・標準ともいえるライブラリに変なのが混ざってると
逆に迷惑かも
scanfやstrtokみたいな弊害というか
使わなきゃいいじゃん。
boostは
正式に標準なわけでも正式に準標準なわけでもないのだから。
でも今更boost::formatやboost::regexは手放せないよなぁ。
boost::regexより鬼車とかの方が(・∀・)イイ!
__ ,,,,,,, - -ー―- 、
┌ー| ヽ、
/ .| ヽ、
/ .| ヽ
/ 〉 .ヽ
, '/ ! ハ ヽ り
,.' / !! ! ヽ |ヽ :::::! :: ::! ::',
/ / ! ! ! ヽ ! ヽ :::.! ::: :::::! :;
/ ,リ :::::::!.! ! ヽ ! ヽ ヽ ::! ::: :::::! :!
! ハ ::::::::::! ! .! ヽ .! ヽ ヾ、 ! :::: :::::! :! なんなのよこいつら・・・
! ; ! .::::::::::!__!」,,, ヾ__\__ヽ,,, :::::::::! .:::: ::::::! .:::',
レ' .! :::::! :::ヽ ヾ ミヽ ヽ ̄  ̄ヽ、ヽ`:::::::.! .:::: .::::/ :::::',
! :::!i ::::::::!《てソヽ "ソて)~ミミア .::: .:::::/:::: !:人ヽ
', ::! ',::::::::ヾ. r ';;ヘ " ヽ ;;;;;。ソy :::/ ..:::::メ:::::: !:::::!`-ゝ
',::!. ', ::::::::', ゝ彡゚ ゝー"/:::イ .::::メノ::::::リ、:::!
'ソ . ',从::::', , /// 彳' N:::リ ヽ:!
i! ヾ、:::ヽ ` /",/ /:::: ハ:リ ソ
ヾ:::!ゝ ヽつ u ,/,/:/:::::::::/ V
V 丶、 ,, - ":::::::レ'!:::::八 :l
` ーヾ!::::::::::::::: ,!ゝソ .V
イ ,!::::::: / \
, -'"/ ヘ ___/ .! !. \
, - '" // , ク-くヾ ! !:::::::::\
, - '" ,///イ ヽヽ // :::::::゙ -、_
ヾ;ン" 〉-、/ヽヽニ彡 ゙-、_
boostは10年後も準々標準ライブラリだと見切りコンビ。
boostは俺の愛奴隷です
冬子萌え━━━━━━(´ω`)━━━━━━!!!!!
policyってどうして多重継承で実現されてるんですか?
ふつうに委譲で怪傑できないんですか?
>>504 委譲でもいけるし、STL でも iterator_traits なんかはそうなってると思うが。
具体例プリーズ。
継承によってポリシーを実現するとき、ホストクラスが要求する
メソッド群をprotectedにするのは悪いっすか?
>>504 >>506のヤシの本に理由が書いてあった気がする。
すっかり忘れた上に手元に無いので答えられないが。
移譲の場合、スコープ解決演算子とかを使って定義位置を明確にしないと呼び出せないあたりだったかも。
>>507 protectedにしても機能するんならいいんじゃない?
わざとそうする理由あるか別だが
>>504 継承を使うと、特定のポリシクラスにpublicなメンバを追加することで、
そのポリシとホストクラスを組み合わせたときの公開インタフェースを
後付けで拡張できる。ホストクラスを変更することなく、ね。
...というのが理由だったような気がする。
>>507 ポリシクラスのprotectedなメンバはホストクラスの公開インタフェースにならない。
公開されたくないメンバはprotected、そのまま公開したいメンバはpublicがよさげ。
ただ、あまりこだわると面倒かも。
>>510 インタフェースを後付けで拡張できるっていいね。
アルゴリズムが共通性でインタフェースが可変って、GoFスレで
話題になってるマルチパラダイム
> アルゴリズムが共通性でインタフェースが可変って、
それって adapter で切り替えるのと比べて なんか違うの?
ライブラリが直接ユーザー提供のインタフェースを身にまとう
のとadapterで切り替えるのじゃ違うべ
実用的にどう違うか説明できん鬱
>>510 >継承を使うと、特定のポリシクラスにpublicなメンバを追加することで、
>そのポリシとホストクラスを組み合わせたときの公開インタフェースを
>後付けで拡張できる。
これって結構危ない気がするんですけどどうなんですかね?
ホストクラスの名前空間をユーザの側で自由に汚せるのが気になるんですが・・・.
特にホストクラスの非公開インターフェース(通常ユーザには明示されない)と
ユーザがポリシークラスに追加した公開インターフェースが衝突したら
目も当てられないと思うんです.
ポリシーはあくまでライブラリ設計者が想定する有限の選択肢
(公開インターフェースの可否を含む)の中から
ユーザが選択するようにするのが安全だと思うのですが,どうでしょうか?
Exceptional C++に指針が載ってたわ(項目25)
public継承では、リスコフの代入規則に則り、IS-AとWORKS-LIKE-Aの両方の
モデルが成り立つことを常に確認しておくこと。オーバーライドされたメンバ関数は
「それ以上も、それ以下も要求しない」が原則である
だって。
>>504 継承にしとかないと、空のポリシークラスがサイズを持ってしまうのが問題なんじゃないの?
>>514 >ホストクラスの非公開インターフェースとユーザがポリシークラスに
>追加した公開インターフェースが衝突したら目も当てられない
非公開インターフェースといえどもソースコード上見えてるんだから
普通そんなことにはならないだろ
>>514 > これって結構危ない気がするんですけどどうなんですかね?
基本的にyes。
> ポリシーはあくまでライブラリ設計者が想定する有限の選択肢
> (公開インターフェースの可否を含む)の中から
> ユーザが選択するようにするのが安全だと思うのですが,どうでしょうか?
基本的にyes。
多重継承によるポリシ切替は、型パラメータで基底クラスを取り替えるという
ある意味乱暴な実現手段を使っているということを念頭に置いた方がよい。
これはC++本来の基本設計で想定された使い方ではないだろうし、
リスコフ置換則に従っているとも言い難い。トリックを駆使しているんだから、
処理系がプログラマのミスに気づいてくれないこともある。
だから、ポリシ+ホストという実装方法は慎重に扱わなければならない。
これだけでもあまり安全な使い方ではないんだから、ホストクラスの
想定から外れるポリシクラスはなおのこと慎重に使う必要がある。
トリックを使うコストに見合う利益が得られるときのみに限り、
基本から逸脱した使い方をするべき。
>>516 > 継承にしとかないと、空のポリシークラスがサイズを持ってしまう
見落としてた。どちらかというとサイズ問題の方が重要かも。
>>514 > これって結構危ない気がするんですけどどうなんですかね?
ある程度yes。
> ポリシーはあくまでライブラリ設計者が想定する有限の選択肢
> (公開インターフェースの可否を含む)の中から
> ユーザが選択するようにするのが安全だと思うのですが,どうでしょうか?
基本的にno。
多重継承によるポリシ切替は、型パラメータで基底クラスが取り替えるという
ある意味これまでと違うパラダイムを使っているということを念頭に置いた方がよい。
これはインタフェースを中心に据える古典的な設計で想定された使い方ではない
だろうけど、Liskov置換則に従ってやる分には問題ない。
ただし、多重継承を利用して切り替えるポリシと委譲によって切り替えるポリシの
選別はホストクラス側で注意深くやってくれているとの前提に立ってのことだ。
確かにポリシ+ホストという実装方法は慎重に扱わなければならない。
各々のポリシクラスの"意味"はホストクラスの想定範囲内になければならない(High
Cohesionを保つという意味で)。だが実際にどんなインタフェースを提供するかは
ホストクラスの監督範囲外だ。
何が"基本"であり何が"逸脱"であるかはパラダイムによって異なる。
>>516 > 継承にしとかないと、空のポリシークラスがサイズを持ってしまう
サイズ問題が重要な場合は無視できないでしょうね。
520 :
デフォルトの名無しさん:04/10/19 19:57:04
copy_nは標準じゃない事に今気づきました
これに相当する処理をSTLのみで実現するにはどうやったら一番効率がいいですか
copyを使ってcopy_nを実装する
>>521 それはまぁそうなんですけど
もっといい方法はないのかなと
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つ読み込む」などのケースでエラーになってしまう。
既存のSTLアルゴリズムじゃ524さんが書いてるように代替が利かない場合がありますよね.
無ければ作れば良いだけなんでは?すぐに書けるでしょう.
boost release branch クルー
copy_ifについてBjarneが言っているのと同じように、
copy_nも自分で書くのが一番いいのではないかと。
どのみち自分で書くのかよ
まあここはSTLの範疇になかった悲しい例ってことでお茶を濁すのが正解だね!
C++ってこういうのがmethodじゃなくて、
generic functionになっているのが良いところだから、
どんどん標準に入れちゃえばいいと思うんだけど…
methodだと流石に躊躇するけどね。
>524を踏まえてiterator_categoryでdistanceでは実装切り替えを行ってるのに
なぜにcopy_nを取り入れてやらないかね。変な所で頭固い?
そりゃcopy_ifやcopy_nくらいは自分で実装はできるけどさ・・
そんな事いったらコンテナだってそうだし
標準である事に意味があるのにね
532 :
デフォルトの名無しさん:04/10/21 02:03:07
とりあえず動く程度なら誰でも実装できるが、
他人に使ってもらえるようなライブラリを書くには
相当の知識と経験が必要
copy_nですら一工夫要りますしね.
template<class I, class O>
void copy_n(I InIt, size_t n, O OutIt)
{
while (n--) {
*OutIt = *InIt;
++OutIt;
++InIt;
}
}
一工夫って、単純に上のように書いただけじゃあだめなの?
OutItがn個進む前に終わっちゃったとき例外投げるとか
536 :
デフォルトの名無しさん:04/10/21 13:04:42
>>534 そんな遅い実装されたライブラリを誰がつかいたがる?
STLPortの実装見て思いましたが,524のような状況がcopy_nの存在意義だとすると
copy_nって終了後の入力イテレータ返さないとまずいですよね?
(STLPortの実装では返り値が入力イテレータと出力イテレータのペアになってる)
標準に入らなかったのはここら辺でもめたからではないでしょうか?
>535
OutputIteratorには「終わり」を判別する方法がまったくないです.
>536
ディスパッチするべきだという指摘ですよね?
n進む前にOutItが終わりに達するときの動作は「未定義」ってことにすればいいじゃん。
C++に多値があればねえ。
>534
これって例外安全じゃないよね?
真面目にやるならSwap関数が必要になるんじゃない?
複数の動作をまとめて行う関数を直接例外安全にするのは無理
543 :
デフォルトの名無しさん:04/10/22 01:59:45
>541
コピーされる型の代入演算子を呼ぶ以上、nothrow guarantee は無理なのでは。
また、strong guarantee のためにはコピー先のイテレータがバイディレクショナルである必要があるから
現状の basic guarantee のみを満たしている状態が妥当なんだと思います。
多分ですけど。
mutating algorithmにstrong guaranteeを求めるのは非常に高コストになるので,
普通は要求するべきではないでしょう.標準でもこれに関しては要求してません.
唯一の例外はuninitialized系だけです.
なんでこんなレスがかぶるんだYO!ヽ(`Д´)ノ
ケコーンしろ、リアルで
>>543 式の日取りはいつが良いですか?
・・・じゃなくて,bidirectionalはstrongの要求としては強すぎませんか?
forward(multipass)で良いと思うのですが・・・.どちらにしろ高コストですけれど.
そりゃそうだな。そもそもイテレータだけじゃSwapできねえか……でも
*OutIt = *InIt;
++OutIt;
++InIt;
全部例外投げる可能性があるのもなぁ
>547
あ、そうですね。思い切り勘違いしてました。
式は、まあ、考えておきます・・・。
550 :
デフォルトの名無しさん:04/10/22 21:56:23
漏れなんて300行以上のプログラムなんて書いたことがない
でもcopy_nなんてのを使うのは例外のことは考えなくて
いい場面なのかもな
>>541 Swapがあれば例外安全なcopy(first,last,result)が実装できるの?
ExcptionalC++になんか載ってたな
>>552 例外安全なSwapがあれば・・・という話だ
>>552 例外安全なSwapがあれば・・・という話だ
swapがあろうとなかろうとクライアントまかせ!!
>>554 swap があってもダメでしょ。forward iterator だと、そもそも「二回読み出せない」
なんつーのもありえる(標準入力とか)から、最初の要素をコピーした直後に例外
が発生すると、どのみち元には戻らない。
>>557 そーだね。
552に対して
×Swapが存在すればいい
○例外安全なSwapの存在の前提としてケースによっては...
と答えたってことでよろ
×例外安全なSwapの存在の前提としてケースによっては...
○例外安全なSwapの存在を前提として、ケースによっては...
鬱
こんなくだらないことで盛り上がってるとはさすが
自分でもイマイチ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を使えとかそういうのはいいです。
>>561 コンパイルして、文句言われる部分を凝視するのがいいかと
>>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
まず
mem_fun→mem_fun_ref
それから
template<typename T, typename R, class GV>
R total(T* t, int n, GV getValue);
としてるが、R型の引数がないので型推論が出来ない上、内部で取ってる
retという変数が初期化されていない。
R&型の引数をとるようにしてmain内の一時変数をそれに与えろ。
>>564 その通りにやったらできました。
accumulateになんで初期値を渡さないといけないのか分かった気がします。
たまには真面目に答えてみようと努力する。
と書いている間に解決してるっぽい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
>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を使う事になるのかな?
あと
total(T* t, int n, GV getValue,~
じゃなく
total(IT begin, IT end, GV getValue,~
なんて標準ぽい書き方にしといたほうがいいな
それまんまaccumulateやん、っていうw
templateの勉強なら各実装のSTL読むのも一興。
>>554 Swapをどうやったらcopyを例外安全にできるのか、未だにわからないんだけど、
コード書いてみてもらえる?
s/Swapをどうやったら/Swapをどう使ったら/
swap を使おうが、nothrow は無理。
copy-constructor と nothrow-swap を用いることで
copy-assignment に strong guarantee を与えるという話。
コードはこんな感じ
T& T::operator = (const T& t)
{
T(t).swap(*this);
return *this;
}
>>572 それは代入演算子の実装。
copyに
>>534以上の例外安全性を持たせることができるのかって話。
ただしこれは一つの要素のコピーの話で、
コピーを複数回するとなると strong guarantee を保障するのはより面倒。
どう面倒なのかは上の方を参照のこと。
>573
copy の仕様?を変えない限り無理。
出力先のイテレータに ForwardIterator であることを要求し、
かつコストを無視してもよければ、まあできるんじゃない。
つまり、 >541,>554,>558 は妄言ってことでいいの?
>>576 良いでしょ。ま、誰にも勘違いはあるってことで、あまり苛めずに
スルーするのが人情かと。
ここでやっと終止符を打つのか。
約577-520の久々の長スレ
乙。
test
boostって開発の初期段階では確かに加速してくれるけど、
プロジェクトが長くなればなるほど重しになっていくような気がする
>>577 ケースによっては...
ってちゃんと言ってるぞ!
しかも542にも学生注目
>>582 スルーしてやろうってのに、妄言追加してどうするよ。
詩ね
うーん...
swap関数と例外安全性と複数回コピーとの関連が複雑でわけわからん
ことになってしまいました。
ケースによっては、とか更に理解困難です。
コピーを巻き戻すためには追加の記憶域(バックアップみたいなの)が必要。
イテレータによる範囲コピーなら、範囲の長さに応じた(動的な)容量が必要になる。
strong guarantee を提供するためにはこの領域を copy 関数内部で取る必要があるが、
その負荷は標準アルゴリズムとしては受け入れられないだろう。
>>586 妄言を理解しようなんて無理だから安心しる。
>587
さらに付け加えて失敗時のロールバックで例外が投げられるという最悪の事態も想定されると思うですがどうでしょうか?
>>588 失敗時のロールバックに nothrow swap が必要になるんだろ。
新たに例外が起こる可能性があるのはバックアップを取るときですね。
まあ、例外安全性は確保されてますが。
>589
>590
イテレータのみを知ってる状態ではそれが不可能な場合が有り得るように思えるのですがどうでしょうか?
そのような操作にはno throwなswapが可能なSappable Iteratorであることが要求されるように思うのですが…
(そしてこのような要求は例えばvectorのイテレータでは達成出来ないように思います)
>591
要するに、>575 の条件プラス nothrow swap が必要となるわけか。
nothrow swap が加わるのは厳しいな。
すいません.591の「nothrow swapg必要」ということ以外はただの思い違いです.
無視してやってください.混乱させて本当にすいません.
589, 590さんのおっしゃる通りです.
>592
nothrow swapは例外安全のための最も基本的な要素なので
「厳しい」というのはどうかと思います.
うーん、
『nothrow swapの存在が前提で、なおかつバックアップを
とるなどの負荷を受け入れられるケースでは、』例外安全にできる(かも)、
って単純に理解しとけばいいですか?
// 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 のほうがいいかも
std::copy(first, first+n, dst) ではいけない訳を50時以内で記述せよ
>>596 50時以内ってのと、誰がそれではいけないと言ったのかがよくわらんが、
first+n は RandomAccessIterator でしか使えないからじゃないか?
>>594 それじゃ妄言と同じだぞ。もっとよく考えろ
std::copy(first, std::advance(first, n), dst)
ごめん、成功時に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;
}
}
>>595 それでも STL で定められている入力イテレータ・前方イテレータのコンセプトを
前提とする限り strong guarantee は得られない。
*result = *first;
ここでイテレータを介した読み書きが副作用を伴う(たとえば *result = 1 と
すると標準出力に 1 と表示されるようなイテレータとか)だとアウト。また
入力イテレータは二回以上読み出せることを保証してない。
単なる入力イテレータ・前方イテレータではなく、より制約のきついコンセプトを
決める必要がある。
>>600 600ゲットしてるぞ。ちなみに俺もそう思ってた。
Exceptional C++に載ってる標準例外安全規則によると、
『例外を投げる可能性のあるコードをすべて取り出し、別の場所で
安全に処理すること。その後、本来の処理の成功を確認した時点で、
例外を投げない処理だけを使ってプログラムの状態の変更を行う』
とあるので、成功時にnothrow swap を使うというのはまさにその通り
だと思う。
>>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 と同じものになるだろう。
>>601 result にはtemplate仮引数名で ForwardIterator を要求しているから、
標準出力に出るようなイテレータはそもそも対象外。
また、
>>595のコードでは入力からは一回しか読んでいない。
問題があるとすれば、 ForwardIterator の制約が
swap_ranges に渡せるイテレータとして十分かどうか、だろう。
>>604 > また、
>>595のコードでは入力からは一回しか読んでいない。
例外発生時に [fist, last) から二度と読み出せないので、情報が失われて
しまう。
失敗したら元に戻す、っていうのと成功が保証された時点で
書き込みを実行するのとじゃ安心度が違うような気がするんだが。
>>604 ForwardIterator x に対する *x は value_type& を返すことを要求されるので swap の引数とすることができる。
この制約があれば swap_ranges に対して ForwardIterator は適格といえる、たぶん。
>>599 advance の戻り値は void ですよ。
>>610 結構な文量だな。
要約すると、
標準入力がエラーで巻き戻せないのは標準出力の仕様で、
そんなもんを扱ってる限り、 strong guarantee なんて無理無理無理無理
だから STL の例外安全性を語るときにはそんなもんアウトオブ眼中じゃ
って感じ?
s/標準出力/標準入力/
というかどうも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ということになるんでしょう.
そりゃ確かにそんなもの面倒見切れるはずないですけれど・・・.
個人的にすごい違和感を感じます・・・.
結局何がいけないのかというと,「Input Iterator Concept」を
安易に「istream_iterator」に結び付けてしまうのがいけないんでしょう.
「istream_iteratorをstrong_copyに渡して例外が飛んだら入力が失われるから
Strong Guaranteeじゃねぇぞヽ(*`Д´)ノゴルァ」と文句を言うのは,
「あるグローバル変数をincrementする特殊なInput Iteratorを
strong_copyに渡して例外が飛んだらその変数が変化したままだから
Strong Guaranteeじゃねぇぞヽ(*`Д´)ノゴルァ」と文句を付けるのと
全く同等だ,ってことなんでしょう.(後者がナンセンスなのは明白でしょう)
ユーザが任意に設定し得る副作用の巻き戻しまで面倒を見切れるはずがない.
だからStrong Guaranteeの定義で,副作用の面倒は見ない,とした.
要するに結論はstrong_copyはInput Iteratorを入力に取れる,ですね.
・・・でもやっぱり納得できねぇ!
s/任意に設定し得る副作用/型パラメータを通して任意に設定し得る副作用/
入力を安全な形でプールした後で、strong_guaranteeな処理を行えばいい。
>>614が納得するかしないかはどうでもいい。
規格としてしごくまっとうだし、使う側として問題ない。
そこでmonadですよ
618 :
デフォルトの名無しさん:04/10/25 20:03:42
Templateって一言で言って何ができるようになるの?
興味はあるんだが、今一実態がつかめん。
怠け者になれる。
>>618 テンプレの使い方テクの正体が分らないなら、一旦Haskellやってみたら?
C++のテンプレの使い方はかなり変則的だけど、その元ネタはあっちから来てるケースが多いんで
向こうの方が本質が見えやすいから。
>>618 型安全なマクロ
最適化を阻害せず、型安全かつ型に依存しない汎用関数プログラミングができる。
その辺を突き詰めてくと関数型プログラミングみたいなのもできるわけだけど、
C++の構文の上にテンプレート独自の構文、セマンティクスが混ざり合って
不思議な世界が拓けてくるわけだが、やりすぎると職場の誰もフォローできない
メンテ不可なゴミコードができる。
構造化プログラミングのグローバル変数とかgotoとか一関数10000行のプログラム
なんかと、一緒。
本質なんかどうでもいいから、STLとかboostとかに触れてみれば面白いんで無いかい?
>>621 > 型安全なマクロ
再帰も加えといて。
// cppのマクロはm4と違って再帰展開がダメ。
>>621 使い方がとてつもなく寒いな、べつにいいけど
キターage
何が変わるの?
主要な変更・追加はReleaseされたらwebに載るから気長に待つよろし
カミング・ヌーン
>>630 シリアライズ キター━━(゜∀゜)━━!!
>出力形式にはテキストファイル、バイナリファイル、XMLファイルが選べ
ファイルになってるけどstringとして吐いたりstreamに吐いたりは出来ないの?
>632
できます。書き方が悪かったですね。
出力先は任意のストリームです。
感動した。
マジ感動した。
お前みたいな奴はうちの子じゃない!
(@益@ .:;) なんだと
キタキタキタ━━━━━━(゚∀゚)━━━━━━ !!
キタキタおやじ。(゚д゚)ウマー。
ではここでグーグル先生の検索ヒット時のように
Boooooooooost!
Assignment, Serialization, String Algorithms
の3つでもう(*´д`*)ハァハァ
子供の頃、期待の新作ゲームのシステムが発表されたときの
あのワクワク感を久しぶりに味わった
641 :
デフォルトの名無しさん:04/10/27 14:15:39
STL初心者ですが、重複を許す双方向リストというか
グラフ図やネットワーク図のような
多対多で経路数も異なるリストを作りたいのですが
multimup系(stlport::hash_multimap)にしてValueに
prevとnextのitelatorをstd::listで持つ
という設計しか浮かばないのですが
良い方法教えて下さい
そんな貴方にboost::graph
>>641 どうやって使うかを書かないと回答のしようが無いと思いますが、
とりあえず boost::graph ではいかがでしょうか?
ありがとうございます。boostもインストールしてみました。
マルコフ連鎖を作りたいのです。しかも複数連鎖で最長Hitを基本に。
人工無脳のようなものをCで作りたいといえば良いでしょうか。
今週末にまたインストールするはめになる
>>641なのでした
STLのランダムアクセスイテレータ i があって
i += hogehoge;
としたあとの i が有効かどうかは
begein() <= i < end()
と判断してOKですよね?
C++スレと間違えたけどました。
でもまあお願いします。
>>646 ランダムアクセスイテレータならばbegin()に直せば
begin() <= i && i < end()でよい。
>>648 ありがとうございます。
そもそも比較演算子が定義されているということは、と考えれば当然だと思いましたが
自信が無かったもので。
JAVAのBreakIteratorみたいなのないのですか?
行単位で操作とかしたいんですが
boost::tokenizerとか使ってみたら?
あとboost1.32.0から登場のstring_algoのsplitにも乞うご期待.
>>646-649 範囲外のイテレータの比較ってokだっけ?
i += hogehoge;する前に、
begin() - i <= hogehoge && hogehoge < end() - i
とした方がいいんじゃないだろうか。
理由はわかりませんが
プログラミング言語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 );
>>653 > 範囲外のイテレータの比較ってokだっけ?
いや、駄目。
ランダムアクセスイテレータの一種であるポインタがまず駄目だし。
>>656 ポインタが範囲外になってもアクセスさえしなければ問題ないのでは?
int *a = new int[10];
cout << a - 10;
これも未定義なのですか?
>>658 そういう意味じゃなくて、不等式の結果の問題。
ISO/IEC 9899:1999 6.5.8 Relational operators参照。
>>658 アドレス参照が許されるのは、その場合だと a から a + 10 まで。それ以外は
未定義。
現実にはまずないと思うが、仮に a がアドレス 40 番地とかに割り当てられて
たらa - 10 が NULL と一致する可能性もあるわけで。
おぉぉ勉強になります。
>>659 JIS X3010:2003(これはC99かな)しか確認できていませんがたしかに未定義と書かれていました。
JIS X3014は17000円もするのか。図書館行ってきまつ。
>>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;
}
>>657 例題の一番左のやつか?
惜しいけど斜めが成り立ってないから魔法陣とはいえない
縦横だけならXORでゼロになってる
地下鉄の吊広告にもなってたね
>>661 俺、a - 10 どころか a - 1 でアンダーフローしたことがあるよ。
16bit 時代の話だが。
large model 使ってると、それなりに良く起こるんだ、これが。
今でも double v[10][100000]; なんて変数を使ってると、
一応起きうる話。C++ だと、そんなことはほとんどしないとは
思うが、数値計算系だと、可能性としてはあるかもしれない。
669 :
デフォルトの名無しさん:04/10/30 14:27:01
1.32に合わせてboost使い始めようかと勉強中。
読めば読むほど俺に使えるか自信が・・・orz
>669
簡単なところから使い始めればいい。
今月のCマガを買うなり、稲葉一浩のBoost本を買うなり、
Webで検索するなりしてみ。
Boostはいくつかのライブラリの集まりだから、全部使いこなす必要はまったくないわけで。
Boost.Preprocessor勉強中
プリプロセッサに関する既知の問題
問題 #3
「私はcppを廃止してしまいたい。」 - Bjarne Stroustrup in [Stroustrup]。
解決法
C/C++ プリプロセッサは末永く存続する。
思わず爆笑しちまったよ
boostのいう週末とはいつのことですか?
終末ですよ?
CVSから持ってきたのはドキュメントは1.32だけど、これ大丈夫なのかしら。
直前で差し替えとか良くあるけど大丈夫だよ
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で使うときのコツ知ってたら教えてください。
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.
まだぁ?チン!チン!
もう新しい週に入っちゃってますが
そして週末になってインスコしたばかりのBoostを再インストールしようと
boost.orgに常駐している
>>641であった orz
>>676 確かどっか書き換えなきゃいけなかったはず
>>678 タイムゾーンが JST じゃないんだよ、きっと。
日曜日ってまだ週末だよ?
カレンダーは日曜始まりのが多いけど、風潮としては週末というのは
日曜も含むっぽいね。
いや,正直あれの期限予告には期待せずに気長に待ったほうが・・・
何度"this weekend"っていう言葉にぬか喜びしたことか・・・
>>683 むしろカレンダーが特殊(由来はどこだろう?)なだけで、キリスト教的には日曜は当たり前に週末だし。
最近は週休二日制が普通だから今のカレンダーの表記だと土日が分離しちゃって分かりにくいよね。
国によって違います。
687 :
デフォルトの名無しさん:04/10/31 11:22:20
snapshot使ったらええやん
明らかなミスでコンパイル通らないところがいくつかあったけど。
このまま放流されちゃうのかな?
自動テスト通らない物はリリースしないだろ
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を調べないと無理なんでしょうか・・
イマイチ理解しかねるが、
std::map<Key, std::set<Item> >
ぐらいか?
なにを持って"同じItem"というのか知らんが。
693 :
デフォルトの名無しさん:04/11/01 13:50:33
>>692 サンクス。こんなのに気がつかなかった漏れ・・・
吊ってきます orz
>>690 Boost.PPとか使ってもっと多くの引数を受け取れるようにすると面白いかもね。
逆に引数は同じでテンプレートの方を差し替えるなんてのも。
具体的な使用方法は思い浮かばないけどw
>>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;
}
>>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; };
};
あー,template template引数による特殊化を使って
template-nameとtemplate-argument-listに分解するんですか.これは面白い.
あとはBoost.PPの出番ですね.ちょっと作ってみようかな?
DRAFT tarball キター
デフォルト引数の扱いが難しい・・・.
rebind<std::vector<int>, std::string>::type
としたときに,vectorの2番目の引数(アロケータ)も一緒に書き換わって欲しいけれど
どうやれば良いのか分からない・・・.
>>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; };
};
これじゃあかん?
だせえ
>>695 そのようなことはちょっとソース見たかぎりじゃ確認できなかったのですが。
apply0の仕様が替わったぐらい。
703 :
デフォルトの名無しさん:04/11/02 01:56:57
>>695 lambdaもapplyも前からあったと思うが、どの辺が変わってるの?
>>700 さすがにそれはadhoc過ぎて・・・.
デフォルト引数を考慮したgenericなrebindは無理なのかも・・・.
>>702 >>703 695については自分が先走りしていただけでした.本当にすいません.
「試しにやってみたら動いちゃった」程度のものを早とちりしたようです.
boost::tokenizer でsepalateしてるんですが
文字が化けてしまいます
今はSJISですがWEB系のツールなのでEUC、JIS、UNICODE扱いたいです
最低でも SJISとEUCは扱いたいのだけど
馬鹿だからわかんないよ
教えて お兄ちゃん
WEB系ならphpかjavaにしよう
C++的には一旦wchar_tに変換して処理、再度適当なCharsetに変換して出力。
>705
ICU使って変換しる
ICUを使うと一気に実行ファイルサイズが10倍に?!
>>710 ライブラリによるだろ。
俺はバベルを使ってるが、ICUほどは増えない。
>>711 すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
>>708 ごめん。ばりばりラムダつかってるわ。
どうも、寝ぼけてたみたい。orz
でもそうするとapplyとラムダをどっちを使うか迷うような気がするけど。
それとbindは・・・まぁ大丈夫か。
716 :
703:04/11/02 23:59:38
>>708 いや、だからMPLのlambdaは昔っから使ってる(秀和のBoost本で知った
記憶がある)が・・・どっか変わったの?applyが自動的にlambda化を
行うようになった点てこと?
メタ関数クラスの構文変更は、0引数のヤツの特殊扱いが要らなくなっ
ただけじゃなかったけ。
てかなんで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
>>716 すんません.超大ボケでした.おっしゃるとおりです.
メタ関数クラスでない普通のクラステンプレートのlambda式で,
placeholderを置き換えてくれる機能は以前のバージョンからありました.
>718
<threading>single/multi
……だったと思う。
721 :
690:04/11/03 18:06:10
722 :
デフォルトの名無しさん:04/11/04 00:04:37
boost::lambda::bind が VC7.1 で使えないことに今日気づいた・・・orz
コンパイラがいくら対応しててもIDEがフリーズしたら意味ねぇんだよ(▼д▼#)
クソIDEだな
boost::filesystem::path に wchar_t 版が無いのはなぜなんでしょうか・・・
boost::filesystem::basic_path< typename Char > を実装してくれみたいな
提案が10ヶ月以上前にメーリングリストに提案されていますが、
まだ実装されてないってことは却下なんですかね。
所詮やつらにとっては英語以外アウトオブ眼中ってことでしょうか。
最初の方しか読むきにならなかったけどようするに作者はアンチゲイツだと言う事か。
>>722 インテリ切るか別のエディタ使わないとダメなんだよね。
>>727 なるほど、テンプレートが入り組みすぎててリソース枯渇とか
そんなところか。
>>724 こんな未熟なライブラリがboostに入ってるほうが不思議。
コネか?
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/. こういうのに日本人がもっと協力してればもう少し考えてくれるかも知れない
その程度で協力したとは言えないような
ついでに次の標準でexceptionとfstreamもワイドバージョン作ってほすぃなぁ・・・。
wfstreamならばあるが?
?
>>736 basic_fstream のコンストラクタはファイル名が const char * 決めうちなんだす。
>>737 自分でラッパクラスつくりゃいいじゃん。と、言ってみたりする今日この頃。
>>738 マリーアントワネットみたいなこというなよ。
>738
それをやってくれるのがboostですよ。
ちなみに、C/C++標準ライブラリでwchar_tを受け付けてくれないのが、
ロケールの初期化とファイルオープンと例外クラス。
オーペン
>>741 (内部がどっちで実装されてるかにも拠るけど)localeはどうしようもないと思う。
spirit超良いね。
ためしにコマンドラインオプションを解析するの作ってみたけど、めちゃ簡単に出来た。
アクションも指定できるから正規表現より断然楽チン。
何を今更
文字列->数値もlexcal_cast使うよりreal_p使ったほうが
断然早いし。
つーかlexcal_castが使わせる気が無い位遅いだけ
>>744 コマンドラインオプション解析ならprogram_options (Boost 1.32.0)もよろしく!
>>749 いまさらイラネ・・・とか思ったけど。
usage message 吐いてくれるのはうれしいかも。
752 :
690:04/11/05 16:16:58
コンパイラもboostのバージョンも書かないから釣り
やっちまった...orz
copy -> foldにしたらいけました。
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できるなら やりかたと確認方法教えて下さい
こりゃ10倍どころの騒ぎじゃないな
760 :
757:04/11/05 21:17:54
とりあえず今コンパイルしている環境は
Win2K、VC6.0、STLport最新リリース、ICU最新リリース、Boost先週までver
ICUはdependency walkerによるとDLLを使っている感じがしますが
BoostとSTLportはDLLを使ってるように見えませんでした。
ageちゃいましたゴメンナサイ・・
762 :
おしえてください:04/11/05 21:59:15
今日からC言語をやり始めたんですが、Borlandとかっていう無償の
ものをダウンロードして環境設定までして見ました。ここまでは
なんとかいったんですが、コンパイル法(?javaでいうとjavacみ
たいなやつ)とかも分からないし、サンプルプログラムもありません
。まだ初心者なので簡単な言葉でここから何をしたらいいか教えて
ください。
>>760 dependency walker で見て DLL を使ってないということは、ホントにスタティック
リンクしてる気が。cl に /MT オプション付けてますか?
>>765 DynamicLinkするなら/MDですよ残念
768 :
デフォルトの名無しさん:04/11/07 00:12:31
Spiritでちょっとした字句解析機書いたら警告6000行出た。
ちょっとびびった。
770 :
質問!:04/11/07 01:27:15
Spirit って使い物になるものですか?
業務でも。
>>770 Spiritはスケーラビリティがものすごく高いから何にでも応用できる。
大規模なものでなくても(というか、大規模なものだとコンパイル時間が半端じゃなく長くなりそう・・・)
ユーザーが入力したテキストの書式をちょっとチェックしたり、
その中からデータを読み取るとかだけでも、
正規表現を使うよりも高機能で柔軟で、読みやすいコードが書ける。
テキストじゃなくてもバイナリに対しても使える。
spiritは実行時の性能が悪い(遅い、スタックを消費する)
コンパイル時の負荷が高い、ビルドすらできない場合がある、っつー、困り者。
普通のパーサジェネレータの方がはるかに効率が上。
yacc/lex/bison/flexだってバイナリに対してだって使える。
spiritのメリットは、C++コンパイラだけあれば使える点と、
動的な構文の切り替えが可能な点だけ。
冷静になって考えてみれば、それがほんとにメリットなのかどうか
疑問に思うはず。
何を以ってスケーラビリティが高いといってるのか分からんが、
実際に使ったこともないのに使えるようなこと書くな。
>それがほんとにメリットなのかどうか
>疑問に思うはず。
本当のメリットはC++のtemplateで実装してあることだ。
俺って超クール?みたいな~ちょべりば~
spiritに粘着が沸いてますね。
そんなに自分が作ったパーサが出来悪かったんですか?
>>775 >spiritのメリットは、C++コンパイラだけあれば使える点
これは結構大きいと思う。ちょっとしたパーサ機能を組み込みたいときとか。
べつにspiritマンセーではないけどさ。
自分の敵を粘着扱いしたいバカが複数人いるようだ。
単純にパーサジェネレータのユーザー人口が増えるからいいんじゃないの。
sript>>>>>>>>>>>>>>yacc/lex/bison/flex
boost最強!!!!!!!!
みたいなのが出てこない限りは。
Ruby>>>>>>>>>>>BOOST
782が真理を突いた!
>775
RACCより速そうだからいいじゃない?
STLの代わりとして将来標準で付くライブラリと言う点で物凄くメリットあるでしょ。
どのコンパイラ・どのプラットフォームでもソースをそのままmake出来る様になるんだから・・・
お前らの言う「将来標準に」って何時よw
クロスプラットフォームならおとなしくRuby使え馬鹿ども。
>>785 >STLの代わりとして
なぜそういう認識になるのか分からない。
BoostはSTLの代替ではなく、相互補完の関係にあると思うんだが?
大体メリットあるでしょって誰に反論してんだよ
789 :
デフォルトの名無しさん:04/11/07 22:58:15
790 :
デフォルトの名無しさん:04/11/07 23:00:12
Rubyって遅いんでしょ
いまどき言語による処理速度の違いなど大した意味を持たないだろう。
専ら重要だとされているのは保守性だよね。
なるべく高速でないと困るようなアプリケーションでは相応の開発方法があるだろう
けれど、どちらかというとそういうアプリケーションは少数派だし、場合によっては
ネイティブなライブラリとして機能が提供されているでしょう?
よって、Rubyが最強だと愚考する次第であります。
そのネイティブなライブラリをRubyで書けるのか?
ハァ?お前ちゃんと人の話聞いてる?
自作ソフトにスクリプト組みたいときはRubyじゃ駄目でしょ。
お前にはね。
Rubyは素晴らしい言語。
日本人はもっと誇りに思うべきだ。
>>795 残念だけど、Rubyはフィルタしているんで見えないんだ。
>>796 フリー/シェアウェア/商用問わず、ソフトウェアに独自スクリプトを組み込みたい時に
Rubyを使えるのか?Rubyってそんなライブラリあるの?ライセンスは?
tuku------------------------------ru
>799
一応、Raccが使える……けど、
Ruby厨(に化けたアンチ)に反応するなよ
>>801 いやすまん、純粋な興味だ。Rubyに限らずスクリプト言語は嫌いなんで知らないんだよ。
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
どっちも痛いな。
なんで C++ template スレで Ruby の議論してるんだ? そんなことより
今は Boost 1.32 が旬だろ。
Ruby>>>>>>>>>>>>>>>>>>>
>>804
>>805 だっていつまで待っても出ねぇんだもん。
10分前に出ました。
kita-ってやらないのkita-って
809は何?
マジですか?
boost/date_time/tz_db_base.hpp 直って無いような気が・・・?
>>807 draft tar ball 置いてあるよ。
spiritのast_parseでCの=演算子のように右から左への結合をする方法は無いでしょうか?
ast_tree_policyのソースを見たところ問答無用で左から右に結合しているようなので
やむを得ず独自のpolicyを書きましたが、
結構長いのでバージョン間の互換性などを考えるとast_parseで出来たほうがうれしいです。
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;
>>817 typedef bind< plus<>, _1, int_<1> > b;
cout<<b::apply<int_<10> >::type::value<<endl;
あと
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;
>>818-819 thx.
(bind+lambda)の場合はメタ関数クラスになるから直接applyできて、
外部applyは(lambda)と(bind+lambda)の両方okと。
継承版はすっきりしてイイですね。
821 :
デフォルトの名無しさん:04/11/10 02:20:06
lambdaはいいとして
bindって何に使うの?
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とか書いてあって驚きだよ。
これがシンクロニシティってやつなのか?
え?逆?
カレー食いたくなってきた
>824
てゆうかガンマでそ
低レベル者で申し訳ないですが
構造体を vectorやmap等に積み込む時ってどうします?
auto_pointer系に詰めて乗せるのが一般的なんですか?
>>830 コピーが低コストならそのままコンテナの要素にする。
コピーできないor高コストならboost::shared_ptrとかに乗せる。
>>831 newで生成した場合
そのままコンテナ要素にしたらdeleteがめんどいような・・・
>>832 newで生成したのならboost::shared_ptrとかに乗せたらいいじゃない。
>>834 >boost辺りで同じ事を出来ないでしょうか?
自分で同じこと(スコープ区切るだけ)をすれば良いだけではないですか?
その記事に書いてあること以上の何をお望みですか?
局所関数の簡単な生成?
>>835 ええと、要するに関数内関数の話です
struct辺りを使ってトリッキーに実現は出来るけど、あんまし読みやすくならないんですよね
これはなかなか可読性も良く、速度も落ちないみたいなんでいいなと
俺なら普通に関数に分けるけどね。
関数内関数を擬似的に実現させる方法はいろいろあると思うんだけど、
テンプレート引数に使えるのはある?
てゆーか、ありえる?
テンプレート引数として渡すには最低でもファイル内スコープを持ってないとダメだからたぶん無理だろう。
>>838 boost::lambdaで強引に書くくらいかな…
ところで何でローカルクラス等だと渡せないの?
外部リンケージとテンプレートみたいにコンパイラの中の人の仕事を楽にするため?
>>841 インライン展開しない/できないときのため
本物はやっぱり便利でっせ
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;
}
>>843 このスレ的に、EnumWindowsはSTLSoft使って欲しい。
>>846 内部関数から親関数のローカル変数って参照できる?
そういやPascalってどうなんだろ
たしか内部関数作れるんだよね。
>>846 ただの内部関数はそれこそイディオムが成立するくらい誰でも出来るのです。
このスレ的にはテンプレート化することが重要なのれす。
Pascalはスタックポインタ、フレームポインタとは別のレジスタを保存して
静的スコープの外側へのリンクを張りながら呼び出すんで。
>>846 ただの関数ポインタとして扱われるからリンケージが関係なくなるのかな
>>847 846さんの方法だと無理です.
local functorなら参照したいローカル変数のポインタを明示的に渡すことで,
一応可能にはなると思います.
>>851 functorだとテンプレート引数に出来ないというジレンマ
>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;
}
>>854 関数内関数を作ったつもりだろうけど結局static関数をつくったら意味が無いという罠だけどね
static関数だとなんで意味無いの?
>856
インライン展開されないんじゃない?
>>847 inner関数が実行されている時は、
outer関数も実行されている時。
これは関数のスコープ規則によって必ず約束される。
inner関数にグローバルスコープを持たせると、
この制約が破られるから、
>>838は駄目。
Lisp/Schemeのようにクロージャで環境問題を解決するか、
局所的なスコープを持った引数を渡されたテンプレートの特殊化は、
局所的なスコープを持つとする必要がある。
member関数の場合、型システムに帰着できるが、
inner関数はスコープ問題になってしまうので、C++は避けているんだろう。
>>856 thisがなくていいの? ってことでしょ。
外部リンケージを持たない型をテンプレートに渡せるようにすればいいだけじゃん。
名前のバッティングとかいろいろ言ってるけどそんなの無名namespaceと同じ方法で解決できるし。
「名前のバッティング」って具体的にどのレス?
>>860 inline 関数中で定義されたクラスをどうするかっつー問題が。
>>860は自由変数をどう扱うかっていう、
Lispの世界で環境問題って言われている問題を理解してないんでしょう。
関数のスコープとライフタイムの一致は、古典的手続き型言語の一つの特徴。
Pascalがもっとも端的。
windowsでフルパスからpathを作成したいのですが、
どうすべきなのでしょうか?
(VC7.1,boost1.31,boost1.32draft)
boost::filesystem::path full_path("c:\test");
//c:\test error
//c:/test error
Javaはfinal指定しておけば関数の外に出てからも参照できるね。
"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"
ま、"c:\\test"だわな。
質問です
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()時に失敗してしまいます
これを解決する方法があれば教えてください
コードがメチャクチャだし、テンプレート引数がHoge*なのもおかしい
書き直します
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 ); のように
別のデータを追加していきたいと考えているのですが…
>>873 boost::shared_ptrの使い方をもう一回調べて来い
そもそもshared_ptrとはなんぞやから調べたほうが良いと思う。
> typedef boost::shared_ptr<Hoge*> pHoge;
typedef boost::shared_ptr<Hoge> pHoge;
ちゃうんかと。
>>876 それはわかっとる。それに、気づくのが遅いよ君。
やれやれ
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入力するの面倒な気が...
>>879 そんな駄目ライブラリは窓から投げ捨てろ
boost::filesystemの作者がアンチM$だしな
アンチMSとかの問題じゃなくてスペース含んだパスの取り扱いの問題だろ?
試してないがスペースをエスケープすればいいんでないの?
どっちにしろマルチバイト文字扱えないんだからWindowsじゃ使えないだろ
Rubydesubetekaiketu !!!!!!!!!!!!!!!
>>885 thanks.
そんな方法があったとは...
>>886 separatorと検出する方法(MBCSを使う)を
外部指定できれば、可能性ないかな?
唯一、MBCSのことを考えてくれたMicrosoftも.NETに移行だし、
もう、C++でMBCSというのは、完全に無いんだろうな。
>>888 マルチバイト対応もワイドキャラクタ対応も数時間あれば出来るようなことだが
作者にその気がないのでしょうがない。
どうせboost::filesystemなんて標準には含まれないのは分ってるんだから
どっちでもいいのでは。使いたくないのなら使わなきゃいいだけなのでは
>>894 C++を動かす環境にファイルシステムがあるとは限らないから。
fopenとかfstreamとかどうなるんだ
標準のfopenやfstreamは名前を指定してストリームを作成する汎用の手段を提供してるに過ぎない。
開くストリームは例えば特定のメモリ領域に名前をつけたものだったり、
極端な話WebページをGETしてもいい。
ファイルシステムとは違う。
現状含まれていないのを根拠に、将来含まれないのが分かってるというのかね?
>897
へりくつー
>>895 freestanding と hosted environment をゴッチャにしてないか?
おとうさまー
(棒読み)
マルチバイトじゃパラメタライズできんから、
テンプレートマクロ集というカテゴリで出すにはふさわしくないだけでしょ。
出すならまた別のライブラリに含める形で。
結論: 日本語をちゃんと扱いたきゃRubyを使え馬鹿ども
>>904 > マルチバイトじゃパラメタライズできんから、
君、レベル低すぎ。
あほか。エンコードごとに
operator[]やfindやsubstrも変更だろ。
場合によっては効率面でopertor[]を
ランダムアクセス禁止にしなければならなくなる。
パラメタライズ出来るじゃん(w
テンプレートでやるメリットがあるとは思えない。
そもそもbasic_stringと互換性が取れなくなるからiostream他との相性も悪くなる。
だから通常のライブラリにすればいいの。
ISO-2022 7bit系
EUC系
Shift_JIS
とか違う部分をパラメタライズして、
共通部分をまとめればいいじゃない。
> そもそもbasic_stringと互換性が取れなくなるからiostream他との相性も悪くなる。
> だから通常のライブラリにすればいいの。
「だから」って…アフォだろ。
char|wchar_tみたいな特別な型を作り出すのは無理?
BOOST_STRONG_TYPEDEF(char,mbc);
char str[] = "123";
mbc mbs[] = "123";//error
typedef singned char EUCCHAR;
typedef unsigned char SJISCHAR;
これならできるんじゃないか?
えー
>>903 まさかスルーされてないとは思わなかったよありが㌧w
>>907 basic_stringですら既にfindとかはパラメタライズされているような。
>>911>>912 何故そのレベルでやろうとするんだ…
char, wchar_t のカテゴリじゃなくて、
char [], wchar_t[] と同じレベルで別カテゴリにあるのがmbcsだよ。
だからbasic_stringじゃなくて、mbc_stringだわな。
interfaceは可能な限りbasic_string風で。
とはいえ今後需要は少なそうだね。
boost 1.32 ブランチトジターョ
wchar_tにしてまでMBCS扱いたくないよな・・・でもサロゲートが・・・。
MSはもうWCHAR=2バイトにしちゃったからこれからずっと2バイトなんだろうな。
DCHAR=4バイトとか出してきそうで怖いな。
www.boost.org 更新キター
A targeted release date is November 17.
またコンパイルし直しかなあ。
boostライブラリのコンパイルはpchとか作ってくれないから時間かかるんだよなあ。
922 :
デフォルトの名無しさん:04/11/16 14:06:23
hash_mapの中身を保存したいんだけど別アイテムへの自己参照してるんだけど
良い方法ないっすかね~?
シリアライズまだ?
aleksey.jpg ワロタ
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)
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!!
やっぱだめぽ
>>926 friend class T; でもだめか?
>>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
C++Primer第3版日本語版P865~866
クラステンプレートにおけるfriend宣言を見ると、
テンプレート・パラメータはfriendクラスそのものには使えないが、friendクラス
のテンプレート・パラメータの方を指定する事ができる。
例
template <typename T>
class Foo {
//いろいろ
};
template <typename T>
class A {
friend class Foo<T>;
};
>>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;
};
>>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)
};
>>931 君にはC++Templatesをお勧めしよう。
大きな声では言えないが、CHMやPDFはよく探せばどこにでも落ちている。
俺は画面で見るのが嫌なのでAMAZONで買ったが。
しかしこんな名著がなぜ日本語訳化されないのか不思議。
>>933 まだだけど内容が偏ってそうなタイトルだな。
936 :
936: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内をいじくらずにコンパイルをとおすにはどうしたらいいですか?
>>936のコードをBCCでやろうとしたらできちゃった。
これじゃ俺には答えられん。OTL
>>936 お前がやりたいのはこれか?
template <typename FP>
struct A;
template <typename R>
struct A<R (*)()>
{enum{id = 0};};
template <>
struct A<void (*)()>
{enum{id = 1};};
>>938 936さんは外部リンケージのある関数ポインタをテンプレートの
非型パラメータに取りたいんでしょう.
>>936 ですか?
そのコードはprimary templateとその特殊化で非型パラメータの型が異っていて
(void (*)()とR (*)()),そういう特殊化は許されないです.
なのでmain関数をいじらずにそれを通すのは無理と思います.
見たところ,関数ポインタからその戻り値がvoidかどうかを判別する静的整数値が
欲しいと見受けられますが,その解釈で良いですか?
STLPortってシリアライズ対応してるんですか?
みあたらないのですが・・・・・
>>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;
}
>>941 それは無理。
typeofが使える環境ならいいけど。
gcc3.2 3.3 3.4 以降 の libstdc++ と、STLportでは、どっち使ってます?
gcc も version 3から、c++ 対応が強化されてますし。
http://boost.sourceforge.net/regression-logs/ みても、stlport は、いらないかと。
VC がないんだけど、前はあったような気がするのだが。
VC7.1 の場合も標準準拠具合は進んでるし、STLport いらないかも?
でもSTLport のほうが速いのかな。
STLPortのデバッグモードがいいよ
>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を実現するってヤツなんですけどね.
boost1.32.0キタ━━━━(゚∀゚)━━━━!!
boost1.32.0やっとキタ━━━━(゚∀゚)━━━━!!
おまえら気づくのおせーよw
タグは打たれないのかい?
すみません、質問があります。
boostのファンクタを使ってみようと思っているのですが、
脳がこんがらがってきました。
boost::shared_ptr< hoge > pointer;
というポインタと、
std::list< boost::weak_ptr< hoge > > container;
というコンテナがあり、
コンテナの中からremove_if()でpointerと同じ値を削除したいのです。
ところが、コンテナの中身がweak_ptrなので、一度lock()しないといけません。
こういう場合、どういうファンクタを書けばいいのでしょうか?
出来ればlambdaを使わず(怖すぎ)、bindやmem_fnだけで書く方法を
教えていただけないでしょうか。
誰か答えろよ。
頭がこんがらがるようなことはやらないが吉。
954 :
デフォルトの名無しさん:04/11/22 14:56:58
誰だよ昨晩から上げ荒らしをしているばかは。一応通報したからね。
>>952 解っているがおまえの態度が気に入らない。
boost lambda で再帰ってどう書けばいいのかな?
>>958 試してないけどboost::functionも使ってこんな感じで行けない?
function<int (int)> f= ret<int>(if_(_1==0)[1].else_[_1*f(_1-1)]);
cout<< f(5)<< endl;
boostの悪い使い方の典型だな
962 :
958:04/11/24 17:50:36
>>960 function<int (int)> f= ret<int>
(if_then_else_return(_1==1,1,_1*f(_1-1)));
とかもやってみたけど駄目みたい。(再帰はムリなのかもしれぬ...
ここまでしてlambda使いたいか?て思う
半年ぐらいC++から離れたら読めなくならない?
>>962 fの呼び出しはbindで包まないとだめだと思うが。
俺の環境ではif_then_elseが使えないから、
function<int (int)> f= bind<int>(var(f), _1);
で、スタックオーバーフローを確認した。
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で書き直すとどうなるの?
>>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));
}
マジでboostからlambdaはずして欲しい。
俺が使わなくても他のやつが使うじゃん。
俺そんなの読むのヤだよ。
って実際lambda使ってるやつ見たことないけど。
勝手だなぁw
lambda を馬鹿みたいに多用する奴がアホなだけだからなま暖かく見守っとけば?
boost自体がお遊びでしょ
boost見てると
「でっきる~かな、でっきる~かな♪」
と聞こえてくるんですが。
ほんとうに聞こえてくるなら病院に行ったほうがいいかと。
C++にlambdaがないのがいけないんだよ。
Perlにすらあるのに。
lambdaは予約語だからな。使わないようにしておかないと。