トップページ⇒tech
985コメント310KB

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

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさんNGNG
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 あたりに。
0002デフォルトの名無しさんNGNG
関連スレ
C++相談室 part29
http://pc5.2ch.net/test/read.cgi/tech/1082047479/l50
【C++】Boost使い集まれ!
http://pc2.2ch.net/test/read.cgi/tech/1033830935/

リンク
STLPort
http://www.stlport.org/

boost
http://www.boost.org/

Loki
http://freshmeat.net/projects/lokilibrary/
http://www.geocities.com/rani_sharoni/LokiPort.html

ISO/IEC 14882
Programming languages -- C++
http://webstore.ansi.org/ansidocstore/product.asp?sku=ISO%2FIEC+14882%2D1998
http://www.kuzbass.ru/docs/isocpp/
0003デフォルトの名無しさんNGNG
boostに関する有名な日本語サイト

・boost info
http://user.ecc.u-tokyo.ac.jp/~g940455/wp/boost/

・boost::spiritっちゃえ!
http://www.c3.club.kyutech.ac.jp/~gridbug/spirit/

・Let's boost
http://www.kmonos.net/alang/boost/

・Regex
http://www.s34.co.jp/cpptechdoc/article/regexpp/

・Boostを使おう
http://www.emaki.minidns.net/Programming/tools/Boost/
0004デフォルトの名無しさんNGNG
重複。
0005デフォルトの名無しさんNGNG
参考図書

・テンプレート
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/
0006デフォルトの名無しさんNGNG
Boost C++ Libraryプログラミング…3点
0007デフォルトの名無しさんNGNG
【C++】template 統合スレ -- Part4
http://pc5.2ch.net/test/read.cgi/tech/1091520997/l50

こっちの方が先に建ったので誘導。
0008デフォルトの名無しさんNGNG
重複じゃなくて番号間違えです。すいません。
0009デフォルトの名無しさんNGNG
で、どっちなんだろう
0010デフォルトの名無しさんNGNG
こっちが本スレ
0011デフォルトの名無しさんNGNG
age
0012ageNGNG
age
0013デフォルトの名無しさんNGNG
hage
0014デフォルトの名無しさんNGNG
そろそろ相談室に統合でいいんじゃねえの?いくつもいらんだろ。
0015デフォルトの名無しさんNGNG
>>14
スレの流れ的には問題ないと思う。
ただ、今あるスレ建てテンプレを相談室のテンプレにそのまま追加でよいのかが気になる。
0016デフォルトの名無しさんNGNG
std::cout ってスレッドセーフなんでしょうか?

今まで使ってなかったんですが Effective C++ に「<stdio.h> ではなく <iostream> を使おう」
という記述があり力強く使うことを推奨してるんで使ってみようかな
と考えているんですが、その構造上どう考えてもスレッドセーフじゃない気がするんですが・・・
0017デフォルトの名無しさんNGNG
>>16
cstdioはスレッドセーフなの?
スレッドセーフじゃなくなってしまうであろう構造とは具体的にどこ?
001816NGNG
>>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++にはいっていたやつ
でしか試してないんですが、別な環境だと大丈夫だったりするんでしょうか
001916NGNG
ちなみにソースはこんな感じです
(実験用コードなんで無限ループさせてるのは平にご容赦)

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本スレッドを起動しました。
0020デフォルトの名無しさんNGNG
>>18
> ・std::cout の実体がひとつしかない
> ・std::cout がバッファリングしている

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

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

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

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

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

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

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

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

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

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

という感じでいいんじゃないだろうか?
0036デフォルトの名無しさんNGNG
つーか、iostreamやprintfでどういう順番で表示されるかなんてOSの標準出力の仕様だと思うんだが。
0037デフォルトの名無しさんNGNG
>>34
同意。

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

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

16の期待する動作がしたいのだったら、ロックとflush()を使って
何とかせよ、ということだと思うのだけど。
004423NGNG
>>43

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

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

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

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

おまえもう良いから消えナ
005023NGNG
すまん。きえるわ。おやすみ。
005123NGNG
ちょっとまて。c_str()の動作はどうなんだ。
リテラルを出力するとどうなる。
0052デフォルトの名無しさんNGNG
>>51 何を心配しているのか知らんが、もう寝ろ。
005323NGNG
>>52
そうするわ。おやすみ。
0054デフォルトの名無しさんNGNG
>>52
最後にはそうやって逃げるんだねw
0055デフォルトの名無しさんNGNG
当たり前だろ
0056デフォルトの名無しさんNGNG
何が?w
005716NGNG
まことに申し訳ございません。std::cout はスレッドセーフでした。
変なマージのされ方をしていた原因は単にシングルスレッド用のライブラリをリンクしていたためでした。

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

どうもお騒がせしました。
0058デフォルトの名無しさんNGNG
>>57
std::ostringstream でまとめてから出力すればどうか。

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

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

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

あやしいな。
 struct pi { static const double value = 3.14・・・・
とかやってるのか?
0064お仕事探していまつ ◆y3A2MadQ16 NGNG
>>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を超える結果を返す正確な整数演算が必要だったため、
それもクラス・テンプレートで実装する必要があったからです。

具体的な各浮動小数点数値はこのテンプレートの特殊バージョンとして与えられます。
0065デフォルトの名無しさんNGNG
>>63
今はpi=3でつ! おまい時代遅れでつ!
0066デフォルトの名無しさんNGNG
ttp://3.141592653589793238462643383279502884197169399375105820974944592.jp/
0067お仕事探していまつ ◆y3A2MadQ16 NGNG
>>64

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

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

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

そのうえISDNではDLが若干辛い。
0068デフォルトの名無しさんNGNG
>>67
宣伝も良いけどさ、踏み込むならスレ統一しろよ
0069デフォルトの名無しさんNGNG
sinhpってはいぱぼりっくかと思った
いや それだけですが
0070お仕事探していまつ ◆y3A2MadQ16 NGNG
>>68
現状では宣伝できるほど整備できてないんでアレですが。まだ公開もしてないし。

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

(´-`).。oO( 空想科学だろう… )
0078デフォルトの名無しさんNGNG
>>70

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

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

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

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

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

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

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

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

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

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

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

----

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

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

子ネタでこれほどまでに引っ張れるのも大した才能だが
無職は友達いない言い訳にはならなぇべ    (´ー`)y−〜〜
0099デフォルトの名無しさんNGNG
>>98
> 無職は友達いない言い訳にはならなぇべ    (´ー`)y−〜〜

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

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

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

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

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

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

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

#CStringなどでもそうなっているのかな?
0108デフォルトの名無しさんNGNG
>>107
あたりまえだ。

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

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

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

0115デフォルトの名無しさんNGNG
そもそもコンパイル通らないだろそれ
0116デフォルトの名無しさんNGNG
>>114
Alist.push_back(new ClassA("hoge"));
直接こうでいいだろ。
0117デフォルトの名無しさんNGNG
>>114
std::list<boost::shared_ptr<ClassA> > Alist;
Alist.push_back(boost::shared_ptr<ClassA>(new ClassA("hoge")));
0118デフォルトの名無しさんNGNG
boost::shared_ptr重い
0119デフォルトの名無しさんNGNG
  /⌒ヽ   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  | ゜Θ゜) < そうでもないよ。
  | ∵ つ  \___________
0120デフォルトの名無しさんNGNG
>>116
>>117の方がいいんじゃないか。new ClassA("hoge")が
成功したあとにAlist.push_back()が失敗したらそのメモリを
誰が回収するんだ?
0121デフォルトの名無しさんNGNG
>>120
大人だなあ。
でもその失敗は,メモリーのアロケーションと違ってロジックにとって致命的な予感...
0122デフォルトの名無しさんNGNG
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
このようにしています。
0123デフォルトの名無しさんNGNG
モテない男板の「これって犯罪じゃね?」スレにて業者を攻撃しております。
鯖がベルギーにあるためなかなか落ちません。援軍よろしくおねがいします。
0124デフォルトの名無しさんNGNG
>122
具体的にどのようにビルドできないのか教えてもらわん事にはどうしようもない。
コンパイラが見つからないのか、コンパイルでこけるのか、リンク時に失敗するのかとか。
あとエラーメッセージも。
0125122NGNG
>>124
LINK : fatal error LNK1104: cannot open file 'msvcprtd.lib'
LINK : fatal error LNK1104: cannot open file 'msvcprt.lib'
とあるのですが、ハードディスク中を探しても出てこないのです。
0126デフォルトの名無しさんNGNG
スレ違いなので放置
0127デフォルトの名無しさんNGNG
STLに使わせるallocatorクラスを作ろうと思うのですが、
文献によりますと、allocatorは同じテンプレートクラスにおいて
等価でなければならいらしいのですが、operator ==とoperator!=を定義して、
つねにtrueとfalseを返すようにしてもローカルなメンバは保持したらダメなのでしょうか?
0128デフォルトの名無しさんNGNG
>>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 にならない場合があるんじゃない?
0129デフォルトの名無しさんNGNG
>127
というか,標準のコンテナに食わせられるAllocatorはインスタンス毎に固有の状態を持てない,
要するにローカルなメンバは持てないという結論になります.
何故こんな厳しい制限を要求する必要があるのかについては例えば「Effective STL」の第10項が詳しいです.
0130デフォルトの名無しさんNGNG
>>128
なぜアロケータを作るのかといいますと、某APIのメモリプールを使いたいからなので、
deallocateは常に成功します。(実際にはなにもしないので)
>>129
それで得た知識を伝授して頂ければありがたいのですが、そうくるなら、読んでみます。
0131デフォルトの名無しさんNGNG
>>127
rebindされたとき、データメンバはどうなるの?
0132デフォルトの名無しさんNGNG
>>130
秘密にされると気になる。
某APIってコレクションとかの話?
0133デフォルトの名無しさんNGNG
templateって、他のクラスのメソッドを呼ぶ時staticにしないといけないので
使いづらいな。型にハマると楽なんだけどな。
0134デフォルトの名無しさんNGNG
>>133
詳しく
0135デフォルトの名無しさんNGNG
>>133は、Modern C++ Design のポリシーあたりか。
0136デフォルトの名無しさんNGNG
あの本ってポリシーを継承してなかったっけ
0137デフォルトの名無しさんNGNG
だから?
0138デフォルトの名無しさんNGNG
あなにもチェルシーあげたい
0139デフォルトの名無しさんNGNG
あなたにも だった or2
0140デフォルトの名無しさんNGNG
「Modern C++ Design」はどれくらいで
「Ancient C++ Design」になるの?
それとも、すでになってる。
0141デフォルトの名無しさんNGNG
>>140
あと二週間とロスタイム分くらいで
0142デフォルトの名無しさんNGNG
モダン焼きがエンシェント焼きになる頃
0143デフォルトの名無しさんNGNG
VC++. NET 2005 (β版)ってtemplateのネストや
部分特殊化はokなんでしょうか?
0144デフォルトの名無しさんNGNG
自分で試せよ
0145強制移動NGNG
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もそうなってるし。
0146デフォルトの名無しさんNGNG
deque の実装に配列の配列を使うと書いてある本があるんですが
実際どうなんでしょうね?ていうかどうやるんだろう…
0147デフォルトの名無しさんNGNG
リングバッファを一つの配列じゃなくて、
複数の配列で実現してdequeにしてるんでしょ。
一つだとサイズを拡張しにくいから。

というか他にどうやってやるんだ…
0148デフォルトの名無しさんNGNG
>>146
gccやSTLportのソース読めば?
0149デフォルトの名無しさんNGNG
あの実装はソースを実際読んでもらうか,あるいは説明するなら絶対に図が必要だ・・・

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

というか配列の配列を使ってるのって単に効率化のためだけで,
別にdequeの本質的な部分(前方に定数償却で挿入できる,など)には
全然関係ないような気がするんですけれど,どうなんでしょう?
0150デフォルトの名無しさんNGNG
STLのコンテナって鼻毛が伸びるほど便利ですね。
0151デフォルトの名無しさんNGNG
鼻毛のほうが便利だけどね。
0152デフォルトの名無しさんNGNG
>151
どういう便利な使い道があるのか教えて
0153デフォルトの名無しさんNGNG
>>152
あえて意識して使うまでもないだろ。
日頃からどれだけのたくさんの不純物を
シャットアウトしてくれてると思ってるんだ。
その時点でSTLより上。
0154デフォルトの名無しさんNGNG
その通りだな
0155デフォルトの名無しさんNGNG
random_shuffleで、RandomNumberGenerator指定しないとランダムにならないのは
仕様なのでしょうか?
あと、RandomNumberGeneratorは自分で作成しないといけないのでしょうか?
0156デフォルトの名無しさんNGNG
>>155
「ランダムにならない」が、「プログラムを複数回起動しても
同一の並べ替えが起こる」を意味すると仮定して回答する。
random_shuffleは乱数生成器としてデフォルトでstd::randを使うから、
毎回違う結果がほしければ、random_shuffleを使う前に毎回違う値でstd::srandを呼ぶべし。
0157デフォルトの名無しさんNGNG
/dev/randomから引っ張ってくればいいんじゃない?
0158デフォルトの名無しさんNGNG
/dev/randomは重いじゃない?
0159デフォルトの名無しさんNGNG
責任を他になすりつけられればそれでOK
0160デフォルトの名無しさんNGNG
   ∩___∩         |
   | ノ\     ヽ        |
  /  ●゛  ● |        |
  | ∪  ( _●_) ミ       j
 彡、   |∪|   |     /devは重い
/     ∩ノ ⊃  ヽ  
(  \ / _ノ |  |
.\ “  /__|  |
  \ /___ /
0161デフォルトの名無しさんNGNG
ギャップバッファが理解できません
0162デフォルトの名無しさんNGNG
頭悪いですね
0163デフォルトの名無しさんNGNG
>>155
大抵のOSの大抵の言語の大抵の処理系では、
srand 相当のものに同じ seed を渡すと(あるいは srand 相当のものを使わないと)
乱数を使うと毎回同じ数列が返されるようになってます。

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

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

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

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

でもrandがグローバルだから使いにくいけどね。
0169デフォルトの名無しさんNGNG
>>166
それを理由にそのような仕様にしたんだよ…
0170デフォルトの名無しさんNGNG
これか?
ttp://www.lysator.liu.se/c/rat/d10.html#4-10-2
0171デフォルトの名無しさんNGNG
線形合同法の疑似乱数生成期に同じ種を与えれば同じ乱数列を吐き出すという現象は
「単体テストやらアルゴリズムの効率の比較やら
プロファイリングに基づいたチューニングをしやすいように」
という人間の要望から発生した?
人間の要望に応じて数学的現象が定まるのはおかしいな。
ピタゴラスの定理は誰かがそれを望んだからそうなったと言うタイプはどこにでもいるが。
0172デフォルトの名無しさんNGNG
>>168
> それを理由にそのような仕様にしたんだよ。srandの規格を嫁。

163を翼嫁

「srand相当のもの」だ

疑似RNG全般についての話

疑似RNG全般の性格をその一部であるsrandの規格から規定するな
0173デフォルトの名無しさんNGNG
>>171>>172

API設計の話をしていることが理解できない頭の人。
0174デフォルトの名無しさんNGNG
>>172
スレ違いの上にウザイから下げて書けヴォケ
0175デフォルトの名無しさんNGNG
>>171
こういう、知識は豊富だけど頭が悪い人、っているよね。
0176デフォルトの名無しさんNGNG
アルゴリズムの話からAPI設計の話にすりかわった?
0177デフォルトの名無しさんNGNG
>>176
はじめからAPIの話だと思ってました。
0178デフォルトの名無しさんNGNG
>>166
MS BASIC はかなり初期のものから RANDOMIZE で seed を与え(られ)る仕様だよ。
実行毎に自動的に seed の初期化はされないけど、それは変数の値も含めて
全ての環境が残るっていう BASIC インタプリタの特性をひきずってるから。
0179デフォルトの名無しさんNGNG
>>171
処理系(ライブラリ)が勝手に seed を変えたりはしない、というAPI の仕様の話をしてます。
だって発端が >>151 だし。んで一般アプリケーションはどう振舞うべきかというと>>156 で
回答が出ているわけで、なんとも終わった話であることであるなぁ・・・
0180デフォルトの名無しさんNGNG
発端が>>151って・・・(w
>>155 じゃねーの?
0181デフォルトの名無しさんNGNG
>>177
アルゴリズムの話からAPI設計の話にすりかえて
そのあとAPI設計の話からAPIの話にすりかえた?
0182デフォルトの名無しさんNGNG
>>181
アルゴリズムって、STL用語で言うところのアルゴリズムのこと?
0183182NGNG
ごめん。ageちゃった……。100回種付けしながら反省してきます。
0184デフォルトの名無しさんNGNG
ていうか >>163 よ

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

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

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

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

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

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

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

変わらないことが必要なことはあるし、変えたいなら自分で変えられるし、と。
0193デフォルトの名無しさんNGNG
えーと、163=178=179=192です。
0194デフォルトの名無しさんNGNG
俺は163じゃないんだけど
とやかく言う前にsrandの規格書を読め
0195is not a 163NGNG
srandの規格を読んだことない厨が知ったかぶりしてるだけでしょう。
頭悪いのバレバレ。
0196デフォルトの名無しさんNGNG
結局、>>166は何をどう誤解したの?
0197163以外の人NGNG
>>166
乱数の仕組みの話題だと勘違いしているようですが、
最初からAPIの話題です
0198デフォルトの名無しさんNGNG
>>163の前半は採用されてるアルゴリズムはこうですよ、という説明、
後半はなぜ採用されたのか、という説明。
なのに、>>166は後半をアルゴリズムがそうである説明だと誤解したわけだね。
なぜそんなありえない誤解の仕方をしたのかは解からないけど、
酔っ払っていたのかもしれないし、頭のおかしい人が沢山いる環境で生活してるのかもしれない。
あんまり攻めてやるな。
0199デフォルトの名無しさんNGNG
163ではありませんが、
163はアルゴリズムの話ではなくて、発端からAPIの話題のつもりです
0200デフォルトの名無しさんNGNG
>>166も仕様の話じゃん。
擬似RND以外に選択肢が無かったみたいなことを言いたかったんじゃないの?
0201デフォルトの名無しさんNGNG
163の前半はC言語の規格が採用したアルゴリズムを説明。
後半は採用した理由。
だから163は間違ってないということでファイナルアンサー?
0202デフォルトの名無しさんNGNG
>>201
それはみんな理解してる。
話題はすでに>>166が何を意味してるのかに移ってる。
0203デフォルトの名無しさんNGNG
APIって言葉がたくさん出てきてるけど
ここではどういう意味で使ってるんですか?
みんなばらばらのように見えるんですが
0204デフォルトの名無しさんNGNG
APIはAPIだべ
0205デフォルトの名無しさんNGNG
APIとはsrandの規格のことかな?
0206デフォルトの名無しさんNGNG
そもそもseedを必要としないほうがいいなら、API内部でseed作るっつーの。
0207デフォルトの名無しさんNGNG
templateを利用することによってDIPが
よりよく実現されると言えるかな?
0208デフォルトの名無しさんNGNG
API を外部に持たせてるのは seed 設定できる理由のためですよ。
複雑になるだけでそれ以外メリットないし。
0209デフォルトの名無しさんNGNG
163じゃないが
163を分かりやすく言い直すと次のようなもの

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

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

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

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

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

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

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

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

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

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

0230デフォルトの名無しさんNGNG
>>229
知らないやつが勉強不足。
0231デフォルトの名無しさんNGNG
>>229
auto_ptrで済む所をなんでもshared_ptrにするのはどうかと思いますね
0232デフォルトの名無しさんNGNG
>>230-231
どうもありがとうございます。

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

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

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

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

分かりやすく
0242デフォルトの名無しさんNGNG
ある意味笑うところかも
0243デフォルトの名無しさんNGNG
マジどころかそれを目的にやってきたのに
「結構マジ話らしい」言われちゅゃおうところが情けな
0244デフォルトの名無しさんNGNG
あげるな
0245デフォルトの名無しさんNGNG
hash_mapはboostより標準ですか?
0246デフォルトの名無しさんNGNG
ちゃいます
0247デフォルトの名無しさんNGNG
>実装がひとつしかない分、boostのほうがまともかもしれない。
これは的を射てますね
つ〜かboostの中の人はSTLに依存しないコードを書いちゃってくれたらいいのに
と思いますよ
sgiと組み合わせるとボロボロ
結局preprocessorしか使えない
lexical_castすら使えないのには泣けました
0248デフォルトの名無しさんNGNG
stlport使ってくだはい
0249247NGNG
stlportということでちょっとついでに込み入ったこと聞きたいんですけどいいですかね
とあるハードウェア用のAPIを使って書かないといけないんです
でそのSDKが既にsgi使ってるんですよ
#includeが<list>だったり<list.h>だったりして

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

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

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

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

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

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

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

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

>>257 わーてるよ\(`Д´)ノ
0261256NGNG
>>260
あの本の中じゃテンプレートを使用しないとどんなことになるのか
例示されてないからイメージ沸きヅラいかも
0262256NGNG
>>261
あぁ。そうだな。
飲みすぎには注意しろよ。
0263デフォルトの名無しさんNGNG
(・∀・)ジサクジエンデシタ
0264デフォルトの名無しさんNGNG
一ひねりしろ
0265デフォルトの名無しさんNGNG
>>256 『状態が保持されている基底クラスを継承するには』という条件が付いて
ますよね?必ずそうしなければいけない訳ではないので仮想継承うんぬんはあまり
気にしなくていいのではないかと。
むしろ『ユーザ・クラスはライブラリ・クラスを継承するものの、その逆は許されない』
という注意点と、前のページの下のほうにある『設計とは、制約を課す作業のことです』
以下の文章をよく読み比べてみて下さい。
0266デフォルトの名無しさんNGNG
このスレを通り過ぎて来たらstlportさんの話がちらほら聞こえてきた。
あぁ、stlportさんをまだ君を大事にしてくださる方々がいるのですね。
僕は、今でもあの時、君と出会った感動を忘れないよ。
今では、僕が君とは交じり合うことは無くなってしまったけど。
どうか、stlportさんとお付き合いを重ねている方々・・・。・
末永く僕の分まで一緒にいてあげてください。
0267デフォルトの名無しさんNGNG
    ._,,,,,,,,,,,,,,,,,,,、     _      ___         ,,,,,,,、
    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――ヽ,
     .゙゙--゙      ~    ゙゙゙°     ゙゙゙゙゙゙゙゙゙゙″  ゙゙゙゜   ゙゚゙゙゙゙゙゙゙゛
0268デフォルトの名無しさんNGNG
_| ̄|.............○))
0269デフォルトの名無しさんNGNG
>>158
seed だけ /dev/random から持ってくれば良いじゃん。
0270デフォルトの名無しさんNGNG
>>269
そんなことするならいっそurandomで
0271デフォルトの名無しさんNGNG
>>534
作らない。
http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/qid=1096270912/sr=1-1/ref=sr_1_18_1/249-7749404-9276354
この本読めばわかる。読まなくてもいいけど。
要するに自分がこのクラスとこのクラス(あるいは関数)は深く関連があるなと思えば一緒のヘッダで宣言するだけの話。
0272271NGNG
恥ずかしい
http://pc5.2ch.net/test/read.cgi/tech/1094494997/
ここに貼るつもりがここでやっちゃった。
0273デフォルトの名無しさんNGNG
すいません、素人質問なんですが。

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)です。どなたか教えて下さい。
0274デフォルトの名無しさんNGNG
>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
0275274NGNG
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
0276273NGNG
>>274,275
ありがとうございます。ちょっとこれから出先なので、今日中に試して報告します。
0277273NGNG
駄目でした・・・

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 が未解決です。

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

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

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

>274 のcppllの記事の中で出てたこのURL読んだ?
ttp://hw001.gate01.com/eggplant/tcf/cpp/boost_build.html
0279273NGNG
>>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: ブロ
ックが大きすぎて、コンパイルできません。

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

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

とある。試してみたら?
0281デフォルトの名無しさんNGNG
#define BOOST_REGEX_MATCH_EXTRA
定義しないとboost::smatch::captures使えなかったのかよ...orz
できれば名前付きキャプチャもサポートしてホスィ
0282273NGNG
>>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様、ありがとうございました。
0283281NGNG
なんか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");
}

0284283の修正NGNG
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
0285デフォルトの名無しさんNGNG
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です。
0286デフォルトの名無しさんNGNG
std::ptr_fun(std::strcmp)
0287デフォルトの名無しさんNGNG
>>286
レスありがとうございます。やってみましたがダメみたいです・・・・
同じようなエラーが出ました。
0288デフォルトの名無しさんNGNG
>>285
それだと、ソートアルゴリズム中で

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

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

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

とか std::string の配列にすれば OK だと思うが、どうよ?
0289デフォルトの名無しさんNGNG
>>288
やっぱりそうなんですか。std::sortには比較関数しか渡せませんからねえ・・・・
std::sortに交換関数も渡せればいいのですが。
でも、教えて頂いたように書き換えてうまく行きました。ありがとうございました。
0290デフォルトの名無しさんNGNG
>>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見たのでうまく表現できん。。。
0291デフォルトの名無しさんNGNG
>>290
あーそっか。std::strcmpではまずいですね。どおりで結果が変だと
思いました。そしたら叙述関数か関数オブジェクトを外部に作ります。

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

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

しかし qsort() に出来て std::sort() だと簡単にはできないというのが悔しい・・・
0295デフォルトの名無しさんNGNG
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; }
0296デフォルトの名無しさんNGNG
// 続き
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;
}
0297デフォルトの名無しさんNGNG
>>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));
0298295NGNG
>>297
しまった・・・俺は馬鹿か・・・orz
0299デフォルトの名無しさんNGNG
結局,char[10]はAssignableでもCopy Constructibleでもないため
sortに突っ込むこと自体間違っている,ということで良いですか?

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

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

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

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

あと設定によってはassertが入るのかな。
0327デフォルトの名無しさんNGNG
shared_ptrって一度普通のポインタに格下げしてからもう一回shared_ptrに突っ込むと、
別々の参照カウンタを参照するようになって狂うんだよな。
普段は気をつけてりゃ良いけど this だけはどうしようもないから困る。
被参照オブジェクト内に参照カウンタを持たせるとか、
new に細工して頭に参照カウンタを埋め込むとか、
被参照オブジェクトに多少制限を加えることで解決出来る方法はあると思うけど、
そういう実装は無いの?
0328デフォルトの名無しさんNGNG
>>327
boost::intrusive_ptr
0329デフォルトの名無しさんNGNG
boostみなおしたよ(´−`)
0330デフォルトの名無しさんNGNG
>>327
http://boost.cppll.jp/HEAD/libs/smart_ptr/enable_shared_from_this.html
0331290NGNG
亀レスすまそ。

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

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

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

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

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の要素数をコンパイルタイムで入れられなくて行き詰まっています…
0333デフォルトの名無しさんNGNG
>>332
template <typename T, unsigned N>
T min_element(T (&ary)[N]) {
  return std::min_element(&ary[0], &ary[N]);
}
0334デフォルトの名無しさんNGNG
>>333
-  return std::min_element(&ary[0], &ary[N]);
+  return *std::min_element(&ary[0], &ary[N]);
0335デフォルトの名無しさんNGNG
>>333
感動しました!
ありがとうございました!!
0336デフォルトの名無しさんNGNG
Qtのsignal/slotが好きだったのでboost_signals見つけて嬉しかったのだけど、
コレとlibsigc++の両方使い比べた人の感想とか聞きたい気がしたようななゆゆゆ
0337デフォルトの名無しさんNGNG
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;
}
0338デフォルトの名無しさんNGNG
これじゃいかんの?
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;
}
0339デフォルトの名無しさんNGNG
ダメなんじゃない?いや、たぶん
0340デフォルトの名無しさんNGNG
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_;
};

とか.
0341デフォルトの名無しさんNGNG
バイト配列を簡単に扱えるクラスってSTLにありますか?
stream系で何かありそうなんですが、よく分かりません。
0342デフォルトの名無しさんNGNG
>>341
std::vector< unsigned char > じゃ不満なの?
0343デフォルトの名無しさんNGNG
>>341
"簡単"の定義による
0344341NGNG
えー、簡単ってのは<<の演算子で追加できるようなやつです。
0345デフォルトの名無しさんNGNG
vectorならpush_backで追加できるが。
0346デフォルトの名無しさんNGNG
std::vector<unsigned char>& operator<<(std::vector<unsigned char>& v, unsigned char c)
{
v.push_back(c);
return v;
}
0347341NGNG
>>346のやり方で、
unsigned charじゃなくて、unsigned charの配列を追加するには
どうしたらいいんでしょうか。
要素の長さだけforで繰り返すんですか?
0348デフォルトの名無しさんNGNG
>>347
どうしても<<がいいのか?
STLには
std::copy( a, a+n, std::back_inserter( c ) );
という決まり文句があるんだが。
0349デフォルトの名無しさんNGNG
vector なら copy じゃなく insert 使えやボケ
0350デフォルトの名無しさんNGNG
Ruby ?????????>>>>>>>>>>>>>>>>>>>>>>>>> C++
0351!=348NGNG
back_inserterは内部でinsert使うと思うんだが。
0352デフォルトの名無しさんNGNG
v.insert(v.end(), c, c+n);
ってことじゃね?
0353デフォルトの名無しさんNGNG
>>344
そういうのならstringstreamはどう?
0354353NGNG
もちろんそのunsigned charの配列が'\0'終端されていないと無理だよ。
0355デフォルトの名無しさんNGNG
別スレで紹介されてた↓
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);
の結果が変わるなんてまったく知らなかったーよ
0356デフォルトの名無しさんNGNG
12へぇくらいかな
0357デフォルトの名無しさんNGNG
>と書くのじゃ順番が違うだけなのに

順番が違ったら大違いだと思うが。
0358デフォルトの名無しさんNGNG
>>351
back_inserter は push_back だよー
0359デフォルトの名無しさんNGNG
reserveしてからcopy、かな。
0360デフォルトの名無しさんNGNG
>>359
insertでいいだろ。
0361デフォルトの名無しさんNGNG
なんでもいいや
0362デフォルトの名無しさんNGNG
>>355
これVC6だとC2667, C2668が出る(´・ω・`)
どう違うんですか?
0363デフォルトの名無しさんNGNG
>>362
リンク先読めよ。
0364デフォルトの名無しさんNGNG
素でURL書いてあるの見えてなかった。
スマンカッタ
0365デフォルトの名無しさんNGNG
その前にVC6のテンプレートを期待してはいけない。
0366デフォルトの名無しさんNGNG
VC6のってANSI準拠じゃねーだろ
0367デフォルトの名無しさんNGNG
ANSI?
0368デフォルトの名無しさんNGNG
ANSI
0369デフォルトの名無しさんNGNG
ANSIより緊急連絡
0370デフォルトの名無しさんNGNG
メデー、メデー。
こちらVC6。本部応答願います。
0371デフォルトの名無しさんNGNG
ANSIタンハァハァ
0372デフォルトの名無しさんNGNG
ANSIタンのおかげで安心。
0373デフォルトの名無しさんNGNG
イテレータとポインタの違いを教えてください
0374デフォルトの名無しさんNGNG
iterator->iterator, proxy パターン
pointer->ただのポインタ
0375373NGNG
えーと、そういうことじゃなくて、
使う上で注意するべきことというか、
ポインタの代わりとしてイテレータが使えない場合があるのかどうか
聞きたかったんです。
0376デフォルトの名無しさんNGNG
>>375
もう少し具体的に。
0377デフォルトの名無しさんNGNG
>>375
イテレータはイテレートできてポインタとしても扱えるもの。
例えば、vectorならポインタもイテレータも同じだけど、
listだとポインタでイテレートできない。

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

じゃあ、全部ランダムアクセスにしろと。
0385デフォルトの名無しさんNGNG
>>384
歴史的な順番としてはそうかもしれないが、言語を作った側の
意図としては順番が逆なのでは?つまり、ポインタがランダム
アクセスイテレータの一形態に過ぎないという。
0386デフォルトの名無しさんNGNG
>>382
イテレータ⊊ポインター
でしょ。
0387デフォルトの名無しさんNGNG
>>381=386
逆
0388デフォルトの名無しさんNGNG
ポインタ=神
イテレータ=サーバント
0389386NGNG
>>387
そうかな〜?
0390デフォルトの名無しさんNGNG
サイズ
イテレータ>=ポインター
0391デフォルトの名無しさんNGNG
>>389
ランダムアクセスイテレータじゃないとポインタで代わりにならないよ。
0392デフォルトの名無しさんNGNG
>>385 は無視かよ
0393デフォルトの名無しさんNGNG
>>390
とは限らない。
0394デフォルトの名無しさんNGNG
>>393
実装によってはイテレータがポインタを保持しない場合ってのがあるの?
0395デフォルトの名無しさんNGNG
>>394
列挙対象がシステムで唯一なら何も持つ必要は無いし、
配列で管理されていればそのインデックスを持つだけでも良い。
0396デフォルトの名無しさんNGNG
ポインタはランダムアクセスイテレータコンセプトのモデルである
0397デフォルトの名無しさんNGNG
>>395
STLの話じゃないの?
0398デフォルトの名無しさんNGNG
>>397
STLのイテレータの話(らしい)けど、STLのコンテナのイテレータの話じゃない。
0399デフォルトの名無しさんNGNG
>>398
なるほど。
0400デフォルトの名無しさんNGNG
>>395
参照演算子はどうするの?
0401デフォルトの名無しさんNGNG
>>394
ゼロレジスタみたいに、常に参照はがしするとゼロを返すイテレータとかも
ありだしね。理論的には。
0402386NGNG
>>385+>>396
で考えると
RandomAccessIterator<T> : private T*{・・・};
OteraIterator : private T*{・・・} となるけど
T* : private RandomAccessIterator<T>, private OtherIterator<T>{・・・}の方がしっくりこない。
0403デフォルトの名無しさんNGNG
>>402
コンセプト同士の関係 (refinement) は、継承じゃ記述できんぞ。言いたいことは
分かるが。
0404デフォルトの名無しさんNGNG
「コンセプト」と「コンセプトのモデル」をごちゃ混ぜに語っている
人が多くて,どうにも議論が追いにくい・・・.

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

ましてやsemanticな要求は・・・ですね.
0408386NGNG
>>403-404
ああ。なるほど。どうやらみなさんと考えてる部分が違ったのですね。
すんません。ペコペコ
0409デフォルトの名無しさんNGNG
おめーら、stlsoftは使ってますか?
0410デフォルトの名無しさんNGNG
>>409
君、ドイツの子?
0411デフォルトの名無しさんNGNG
おらんだ
0412デフォルトの名無しさんNGNG
> C++ だと operator は継承できないし
てどういう意味?
0413デフォルトの名無しさんNGNG
>>412
そのままだが。C++ の言語仕様。
0414デフォルトの名無しさんNGNG
>413 VC7.1付属MSDNライブラリより。
・All overloaded operators except assignment (operator=) are inherited by derived classes.
0415デフォルトの名無しさんNGNG
あと単項演算子はともかく、二項演算子はフリー関数にして friend 宣言することが
多いから、継承も何もないわな。
0416デフォルトの名無しさんNGNG
継承できない(しない)のはoperator=だけだろ
それとフリー関数で提供した場合は継承は関係ないが
"要求"は保存される
(コンセプトとは要求の集合である、という文脈で)
0417デフォルトの名無しさんNGNG
>>416 台風接近中
厨を晒してる場合じゃないぞ
0418413NGNG
>>414
なんか微妙に荒れてるが、俺の勘違いってコトで。ゴメンね。
0419boost/mpl/apply.hppを眺めて。NGNG
# define BOOST_MPL_PREPROCESSED_HEADER apply.hpp
# include "boost/mpl/aux_/include_preprocessed.hpp"
この2行がすべてを無意味にする恐ろしいヘッダファイルであった。
因み環境vc7.1。
0420デフォルトの名無しさんNGNG
詳しく
0421確かにこれは恐ろしいwNGNG
>419
無意味になったのは「マクロの嵐を必死こいて解読した努力」ですか?w
0422デフォルトの名無しさんNGNG
いやなことでもあったの?
0423デフォルトの名無しさんNGNG
>マクロの嵐、
俺は洟から解読をあきらめた
0424419NGNG
>>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ヘッダの役目を終えてしまう仕組みになってたんでね。
0425デフォルトの名無しさんNGNG
>>419
>>424

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

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


な。
0426デフォルトの名無しさんNGNG
421は煽りっぽく読めますね,すいませぬ.

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

>>425
アイアイサー。
しかし、また書く時あるかも・・・・・あしからず。
0428デフォルトの名無しさんNGNG
( ゚д゚)ポカーン
0429デフォルトの名無しさんNGNG
プリプロセスをPPって書く人を始めてみました
0430デフォルトの名無しさんNGNG
cpp
0431デフォルトの名無しさんNGNG
Boost.PPって正式名称じゃないか?
0432デフォルトの名無しさんNGNG
$ cpp 429.cpp
0433デフォルトの名無しさんNGNG
>>429
出会いが少ないから
0434デフォルトの名無しさんNGNG
str += "aiueo";
とは別の方法としての

std::string str;
str.reserve(6);
strcpy(&str[0], "aiueo");
は問題ない使い方でしょうか?
0435デフォルトの名無しさんNGNG
>>434
>&str[0]
こんなの渡すのは通常は問題じゃないの?
0436434NGNG
>>435
では(書き込み用に)文字配列(バッファポインタ)を要求するような関数に
std::stringを渡す事は出来ないのでしょうか?
0437434NGNG
参照カウンタで文字列を共有するような実装ならポインタ渡したらまずいですかね。
素直にstd::vector<char>とか渡せばいいのかな。
0438デフォルトの名無しさんNGNG
(とりあえず434はresize?)
書き込んだ結果途中で\0なんか入れられたら
訳分からんことにもなろうし
0439デフォルトの名無しさんNGNG
>>434
STLスレで見かけたんだけどstd::stringではstd::vectorと違い要素が連続していなくてもいいらしい。
そんなのありえないだろうけどやめとけ。
0440434NGNG
>>438-439
後で原因不明のバグになったらイヤなのでやめときます。
ありがとう。
0441デフォルトの名無しさんNGNG
こーゆう話題がでるのでC++スレにこのスレとSTLスレは
もうそろそろ統合する時期なのかも。
Boostスレはまだ統合しなくてもいいけど。
0442デフォルトの名無しさんNGNG
>>441
そろそろ統合する時期っつーか、
C++とtemplateの2スレでやってきたところに
突然このスレが発生したわけだが。
0443デフォルトの名無しさんNGNG
>442
0444デフォルトの名無しさんNGNG
>>434の「reserve()」ってとこには誰も突っ込まないのか?
0445444NGNG
>>438が突っ込んでた、スマン
0446デフォルトの名無しさんNGNG
BorlandのBuilderとVC(MFC)で使っている
自作のクラスの中でメモリを確保していた部分を
vectorで書き直そうと思っているのですが,
互換性などは問題ないのでしょうか?
STLと一言で言ってもライブラリを作っているところは
いろいろあると書いてあったので.
0447デフォルトの名無しさんNGNG
>>446
> 自作のクラスの中でメモリを確保していた部分を

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

最大値→サイズ
0452デフォルトの名無しさんNGNG
boost本のlambdaの解説にて疑問に思いました
for_eachのみ(無名関数)で頑張るために新しい文法(lambdaの)を駆使するより
普通に関数つくるかforループ回したほうがよくないですか?
最初のサンプルで簡潔に書けることを示している部分には同意しますが
例外処理してる部分なんてみにくいだけのような気がします
(こんなことも出来るよサンプルだとは思います)
私の理解不足でしょうか。
0453デフォルトの名無しさんNGNG
問題は、lambdaを無理矢理がんばって実装してることにある。
おとなしく言語仕様に加えろと。
0454デフォルトの名無しさんNGNG
おとなしくD言語に移行しろってことか
0455452NGNG
たしかにリファレンスを見ているだけで無理矢理感がつたわってきますね
関数内のローカル関数がかければ随分違ってくるのでしょうか
sortの比較にちょちょっと使う程度なら便利だよってことでしょうか
0456デフォルトの名無しさんNGNG
template 引数が外部リンケージ(でしたっけ?)を持たなければいけないという仕様はなぜ生まれたのでしょうか。
関数内のクラスをテンプレートに渡したいと思う場面は頻繁に発生します。
0457デフォルトの名無しさんNGNG
頻繁?
0458デフォルトの名無しさんNGNG
>>456
> template 引数が外部リンケージ(でしたっけ?)を持たなければいけないという仕様はなぜ生まれたのでしょうか。
おそらく、テンプレートがインライン展開されなかった場合のシンボルが重複しない
ように、だと思われ。
0459デフォルトの名無しさんNGNG
>>456
安心しろ、俺も頻繁だ。
0460デフォルトの名無しさんNGNG
>>452-453
http://www.freeml.com/message/[email protected]/7818
http://www.freeml.com/message/[email protected]/7937
こういうのはどうだ?
0461デフォルトの名無しさんNGNG
マクロを見ると鳥肌が立つのは俺だけか?
0462デフォルトの名無しさんNGNG
マ○○を見ると○○が立つのは俺だけか?
0463デフォルトの名無しさんNGNG
>>460
結局のところ、どんなに頑張っても…、という空しさが募るばかりです。
0464デフォルトの名無しさんNGNG
C++が糞であることの何よりの証拠だな。
さっさとRubyに移行しろ低能ども
0465デフォルトの名無しさんNGNG
>>462
安心しろ、俺もだ。
0466デフォルトの名無しさんNGNG
珍宝
0467デフォルトの名無しさんNGNG
でも別に珍しくはない
0468デフォルトの名無しさんNGNG
正直、lambdaがあってもそんなに便利になるとも思えないんだけど
サンプルコードとかテストコード書くときはちょっと便利そうだけど

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

LispならともかくC++でlambdaって意味わかんね。
0473デフォルトの名無しさんNGNG
boost::lambdaの話なのか、lambda一般の話なのか解からないのは俺だけだ。
0474デフォルトの名無しさんNGNG
まなな?
0475デフォルトの名無しさんNGNG
でも、実際ラムダ使えねーけど。
整数にる内部足し算は可能なのに
(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);
こんなことやってらんないし。
0476デフォルトの名無しさんNGNG
>>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 の比じゃない。
0477デフォルトの名無しさんNGNG
>>475
okとNGは何が違うの?
0478デフォルトの名無しさんNGNG
俺いちいちファンクタつくっちゃうなぁ
その方がコンパイル速いし 可読性もあるし
0479デフォルトの名無しさんNGNG
>475
ob, n, kがユーザ定義型なんですか?もしそうならret使ってくださいな.
http://tinyurl.com/5dyye
0480デフォルトの名無しさんNGNG
if_とかwhile_を使った面白い例とかないの?
0481479NGNG
癖で英語のドキュメント指しちゃった.
日本語ドキュメントはこっち.
http://tinyurl.com/4copy
あと,これも.
http://tinyurl.com/6tnv9
0482デフォルトの名無しさんNGNG
>>478
> その方がコンパイル速いし 可読性もあるし
コンパイル速度はともかく、可読性は慣れのような気がする。さすがに
boost::bind() を 3 つも 4 つもネストさせて合成関数作るようなコードは
アレだが、476 程度で「読みにくい」っつーことはあるまい。
0483デフォルトの名無しさんNGNG
>>477-479
Cをユーザー定義型として、friendのoperator+を持っています。
で、先の式の説明をいたしますと
C c(10), d(20), m(0);
(var(m) = _1 + _2)(c,d);
ラムダ式でmに代入をするという目的だけの式が作れないんですよ。
なんで?って感じでいまだに謎のままです。
0484デフォルトの名無しさんNGNG
>>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に挙げたドキュメントを参照してください.
0485デフォルトの名無しさんNGNG
>>484
おฺぉฺすฺげฺぇฺ〰ฺ
ってゆう前にごめんなさい。よく読んで無かったですね。
「Extending return type deduction system」もろですね。
0486デフォルトの名無しさんNGNG
lambda使わないと、ファンクタ一個作るために
構造体の定義書いて、さらにそこでしか使わないようなファンクタなら
無名namespaceで囲わなきゃいけないから面倒だし、
構造体の定義は関数中に書いてもテンプレート引数には渡せないから
わざわざグローバルなスコープに戻って定義しなきゃならん。
これだと読むときにも、いちいちファンクタの定義探すのが面倒なんだよね。

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


と半年Java漬けで毒されつつある俺は思う。
0489デフォルトの名無しさんNGNG
関係ないけど自作処理系でlambda使える様にした。
結局これはインラインで滞りなく書けることに意義があるんだよ。
boost::lambdaは実装者の自己満足でしかない。
0490デフォルトの名無しさんNGNG
仕事だと、まず C/C++ であることに意義がある場合が多いわけだが。
0491デフォルトの名無しさんNGNG
>>490
Cだよ
0492デフォルトの名無しさんNGNG
実用言語に非実用的なライブラリは要らない
0493デフォルトの名無しさんNGNG
使わなきゃいいじゃん……
0494デフォルトの名無しさんNGNG
boostみたいな準・標準ともいえるライブラリに変なのが混ざってると
逆に迷惑かも
scanfやstrtokみたいな弊害というか
0495デフォルトの名無しさんNGNG
使わなきゃいいじゃん。
boostは
正式に標準なわけでも正式に準標準なわけでもないのだから。
0496デフォルトの名無しさんNGNG
でも今更boost::formatやboost::regexは手放せないよなぁ。
0497デフォルトの名無しさんNGNG
boost::regexより鬼車とかの方が(・∀・)イイ!
0498デフォルトの名無しさんNGNG
          __  ,,,,,,,  - −ー―-  、
       ┌ー|                  ヽ、
       /  .|                   ヽ、
      /    .|                    ヽ
      /    〉                     .ヽ
     , '/  !  ハ  ヽ                  り
    ,.' /  !!  ! ヽ  |ヽ         :::::!    ::  ::! ::',
   / /   ! ! !  ヽ  ! ヽ           :::.!   :::  :::::! :;
  / ,リ :::::::!.! !    ヽ ! ヽ  ヽ      ::!   :::  :::::! :!
  ! ハ ::::::::::! ! .!    ヽ .!  ヽ  ヾ、      !  ::::  :::::!  :!  なんなのよこいつら・・・
  ! ; ! .::::::::::!__!」,,,    ヾ__\__ヽ,,, :::::::::!  .::::  ::::::! .:::',
  レ' .! :::::! :::ヽ ヾ ミヽ   ヽ ̄  ̄ヽ、ヽ`:::::::.! .::::  .::::/  :::::',
    ! :::!i ::::::::!《てソヽ     "ソて)~ミミア .::: .:::::/:::: !:人ヽ
    ', ::! ',::::::::ヾ. r ';;ヘ      "  ヽ ;;;;;。ソy :::/ ..:::::メ:::::: !:::::!`-ゝ
    ',::!. ', ::::::::', ゝ彡゚         ゝー"/:::イ .::::メノ::::::リ、:::!
     'ソ . ',从::::',   ,           ///  彳' N:::リ ヽ:!
     i!  ヾ、:::ヽ  `         /",/ /:::: ハ:リ  ソ
         ヾ:::!ゝ   ヽつ   u ,/,/:/:::::::::/ V
          V  丶、   ,, - ":::::::レ'!:::::八 :l
               ` ーヾ!:::::::::::::::  ,!ゝソ .V
                 イ ,!:::::::   /   \
              , -'"/  ヘ ___/   .! !. \
         , - '"  // , ク-くヾ     ! !:::::::::\
      , - '"     ,///イ   ヽヽ   //   :::::::゙ -、_
              ヾ;ン" 〉-、/ヽヽニ彡         ゙-、_
0499デフォルトの名無しさんNGNG
boostは10年後も準々標準ライブラリだと見切りコンビ。
0500デフォルトの名無しさんNGNG
boostは俺の愛奴隷です
0501デフォルトの名無しさんNGNG
>>498-500
通報しますた

森へおかえり
http://idol.bbspink.com/test/read.cgi/hgame2/1096640890/
0502デフォルトの名無しさんNGNG
>>501
まだ現役スレがあるのか……
0503デフォルトの名無しさんNGNG
冬子萌え━━━━━━(´ω`)━━━━━━!!!!!
0504デフォルトの名無しさんNGNG
policyってどうして多重継承で実現されてるんですか?
ふつうに委譲で怪傑できないんですか?
0505デフォルトの名無しさんNGNG
>>504
委譲でもいけるし、STL でも iterator_traits なんかはそうなってると思うが。
具体例プリーズ。
0506デフォルトの名無しさんNGNG
http://www.boost.org/more/generic_programming.html#policy

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

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

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

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

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

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

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

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

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

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

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

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

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

>>516
> 継承にしとかないと、空のポリシークラスがサイズを持ってしまう
サイズ問題が重要な場合は無視できないでしょうね。
0520デフォルトの名無しさんNGNG
copy_nは標準じゃない事に今気づきました
これに相当する処理をSTLのみで実現するにはどうやったら一番効率がいいですか
0521デフォルトの名無しさんNGNG
copyを使ってcopy_nを実装する
0522520NGNG
>>521
それはまぁそうなんですけど
もっといい方法はないのかなと
0523デフォルトの名無しさんNGNG
>>522
521の案が1番良いと思うが。
0524デフォルトの名無しさんNGNG
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つ読み込む」などのケースでエラーになってしまう。
0525デフォルトの名無しさんNGNG
既存のSTLアルゴリズムじゃ524さんが書いてるように代替が利かない場合がありますよね.
無ければ作れば良いだけなんでは?すぐに書けるでしょう.
0526デフォルトの名無しさんNGNG
boost release branch クルー
0527デフォルトの名無しさんNGNG
copy_ifについてBjarneが言っているのと同じように、
copy_nも自分で書くのが一番いいのではないかと。
0528デフォルトの名無しさんNGNG
どのみち自分で書くのかよ
まあここはSTLの範疇になかった悲しい例ってことでお茶を濁すのが正解だね!
0529デフォルトの名無しさんNGNG
C++ってこういうのがmethodじゃなくて、
generic functionになっているのが良いところだから、
どんどん標準に入れちゃえばいいと思うんだけど…

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

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

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

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

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

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

全部例外投げる可能性があるのもなぁ
0549543NGNG
>547
あ、そうですね。思い切り勘違いしてました。
式は、まあ、考えておきます・・・。
0550デフォルトの名無しさんNGNG
漏れなんて300行以上のプログラムなんて書いたことがない
0551542NGNG
でもcopy_nなんてのを使うのは例外のことは考えなくて
いい場面なのかもな
0552デフォルトの名無しさんNGNG
>>541
Swapがあれば例外安全なcopy(first,last,result)が実装できるの?
0553デフォルトの名無しさんNGNG
ExcptionalC++になんか載ってたな
0554デフォルトの名無しさんNGNG
>>552
例外安全なSwapがあれば・・・という話だ
0555デフォルトの名無しさんNGNG
>>552
例外安全なSwapがあれば・・・という話だ
0556デフォルトの名無しさんNGNG
swapがあろうとなかろうとクライアントまかせ!!
0557デフォルトの名無しさんNGNG
>>554
swap があってもダメでしょ。forward iterator だと、そもそも「二回読み出せない」
なんつーのもありえる(標準入力とか)から、最初の要素をコピーした直後に例外
が発生すると、どのみち元には戻らない。
0558554NGNG
>>557
そーだね。

552に対して
×Swapが存在すればいい
○例外安全なSwapの存在の前提としてケースによっては...
と答えたってことでよろ
0559デフォルトの名無しさんNGNG
×例外安全なSwapの存在の前提としてケースによっては...
○例外安全なSwapの存在を前提として、ケースによっては...
鬱
0560デフォルトの名無しさんNGNG
こんなくだらないことで盛り上がってるとはさすが
0561デフォルトの名無しさんNGNG
自分でもイマイチ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を使えとかそういうのはいいです。
0562デフォルトの名無しさんNGNG
>>561
コンパイルして、文句言われる部分を凝視するのがいいかと
0563デフォルトの名無しさんNGNG
>>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
0564デフォルトの名無しさんNGNG
まず
mem_fun→mem_fun_ref

それから
template<typename T, typename R, class GV>
R total(T* t, int n, GV getValue);
としてるが、R型の引数がないので型推論が出来ない上、内部で取ってる
retという変数が初期化されていない。
R&型の引数をとるようにしてmain内の一時変数をそれに与えろ。
0565デフォルトの名無しさんNGNG
>>564
その通りにやったらできました。
accumulateになんで初期値を渡さないといけないのか分かった気がします。
0566デフォルトの名無しさんNGNG
たまには真面目に答えてみようと努力する。
と書いている間に解決してるっぽい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
0567デフォルトの名無しさんNGNG
>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を使う事になるのかな?
0568564NGNG
あと
total(T* t, int n, GV getValue,〜
じゃなく
total(IT begin, IT end, GV getValue,〜
なんて標準ぽい書き方にしといたほうがいいな
0569デフォルトの名無しさんNGNG
それまんまaccumulateやん、っていうw
templateの勉強なら各実装のSTL読むのも一興。
0570552NGNG
>>554
Swapをどうやったらcopyを例外安全にできるのか、未だにわからないんだけど、
コード書いてみてもらえる?
0571デフォルトの名無しさんNGNG
s/Swapをどうやったら/Swapをどう使ったら/
0572デフォルトの名無しさんNGNG
swap を使おうが、nothrow は無理。
copy-constructor と nothrow-swap を用いることで
copy-assignment に strong guarantee を与えるという話。

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

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

>592
nothrow swapは例外安全のための最も基本的な要素なので
「厳しい」というのはどうかと思います.
0594586NGNG
うーん、

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

って単純に理解しとけばいいですか?
0595デフォルトの名無しさんNGNG
// 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 のほうがいいかも
0596デフォルトの名無しさんNGNG
std::copy(first, first+n, dst) ではいけない訳を50時以内で記述せよ
0597デフォルトの名無しさんNGNG
>>596
50時以内ってのと、誰がそれではいけないと言ったのかがよくわらんが、
first+n は RandomAccessIterator でしか使えないからじゃないか?
0598デフォルトの名無しさんNGNG
>>594
それじゃ妄言と同じだぞ。もっとよく考えろ
0599デフォルトの名無しさんNGNG
std::copy(first, std::advance(first, n), dst)
0600デフォルトの名無しさんNGNG
ごめん、成功時に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;
}
}
0601デフォルトの名無しさんNGNG
>>595
それでも STL で定められている入力イテレータ・前方イテレータのコンセプトを
前提とする限り strong guarantee は得られない。

*result = *first;

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

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

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

とあるので、成功時にnothrow swap を使うというのはまさにその通り
だと思う。
0603デフォルトの名無しさんNGNG
>>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 と同じものになるだろう。
0604デフォルトの名無しさんNGNG
>>601
result にはtemplate仮引数名で ForwardIterator を要求しているから、
標準出力に出るようなイテレータはそもそも対象外。
また、>>595のコードでは入力からは一回しか読んでいない。

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

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

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

要約すると、
標準入力がエラーで巻き戻せないのは標準出力の仕様で、
そんなもんを扱ってる限り、 strong guarantee なんて無理無理無理無理
だから STL の例外安全性を語るときにはそんなもんアウトオブ眼中じゃ
って感じ?
0612デフォルトの名無しさんNGNG
s/標準出力/標準入力/
0613デフォルトの名無しさんNGNG
というかどうも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ということになるんでしょう.
そりゃ確かにそんなもの面倒見切れるはずないですけれど・・・.
個人的にすごい違和感を感じます・・・.
0614デフォルトの名無しさんNGNG
結局何がいけないのかというと,「Input Iterator Concept」を
安易に「istream_iterator」に結び付けてしまうのがいけないんでしょう.
「istream_iteratorをstrong_copyに渡して例外が飛んだら入力が失われるから
Strong Guaranteeじゃねぇぞヽ(*`Д´)ノゴルァ」と文句を言うのは,
「あるグローバル変数をincrementする特殊なInput Iteratorを
strong_copyに渡して例外が飛んだらその変数が変化したままだから
Strong Guaranteeじゃねぇぞヽ(*`Д´)ノゴルァ」と文句を付けるのと
全く同等だ,ってことなんでしょう.(後者がナンセンスなのは明白でしょう)
ユーザが任意に設定し得る副作用の巻き戻しまで面倒を見切れるはずがない.
だからStrong Guaranteeの定義で,副作用の面倒は見ない,とした.
要するに結論はstrong_copyはInput Iteratorを入力に取れる,ですね.
・・・でもやっぱり納得できねぇ!
0615デフォルトの名無しさんNGNG
s/任意に設定し得る副作用/型パラメータを通して任意に設定し得る副作用/
0616デフォルトの名無しさんNGNG
入力を安全な形でプールした後で、strong_guaranteeな処理を行えばいい。

>>614が納得するかしないかはどうでもいい。
規格としてしごくまっとうだし、使う側として問題ない。
0617デフォルトの名無しさんNGNG
そこでmonadですよ
0618デフォルトの名無しさんNGNG
Templateって一言で言って何ができるようになるの?
興味はあるんだが、今一実態がつかめん。
0619デフォルトの名無しさんNGNG
怠け者になれる。
0620デフォルトの名無しさんNGNG
>>618
テンプレの使い方テクの正体が分らないなら、一旦Haskellやってみたら?
C++のテンプレの使い方はかなり変則的だけど、その元ネタはあっちから来てるケースが多いんで
向こうの方が本質が見えやすいから。
0621デフォルトの名無しさんNGNG
>>618
型安全なマクロ

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

本質なんかどうでもいいから、STLとかboostとかに触れてみれば面白いんで無いかい?
0622デフォルトの名無しさんNGNG
>>621
> 型安全なマクロ

再帰も加えといて。
// cppのマクロはm4と違って再帰展開がダメ。
0623デフォルトの名無しさんNGNG
>>621
使い方がとてつもなく寒いな、べつにいいけど
0624デフォルトの名無しさんNGNG
http://www.boost.org/
Coming soon - Version 1.32.0
0625デフォルトの名無しさんNGNG
>>624
おおおそうか。楽しみだ。
0626デフォルトの名無しさんNGNG
キターage
0627デフォルトの名無しさんNGNG
何が変わるの?
0628デフォルトの名無しさんNGNG
主要な変更・追加はReleaseされたらwebに載るから気長に待つよろし
0629デフォルトの名無しさんNGNG
カミング・ヌーン
0630デフォルトの名無しさんNGNG
>627
ttp://jbbs.livedoor.jp/bbs/read.cgi/computer/5651/1048584601/88
0631デフォルトの名無しさんNGNG
>>630
シリアライズ キター━━(゜∀゜)━━!!
0632デフォルトの名無しさんNGNG
>出力形式にはテキストファイル、バイナリファイル、XMLファイルが選べ
ファイルになってるけどstringとして吐いたりstreamに吐いたりは出来ないの?
0633>>630の記事書いた人NGNG
>632
できます。書き方が悪かったですね。
出力先は任意のストリームです。
0634デフォルトの名無しさんNGNG
感動した。


マジ感動した。
0635デフォルトの名無しさんNGNG
お前みたいな奴はうちの子じゃない!
0636デフォルトの名無しさんNGNG
(@�u@ .:;) なんだと
0637デフォルトの名無しさんNGNG
キタキタキタ━━━━━━(゚∀゚)━━━━━━ !!
キタキタおやじ。(゚д゚)ウマー。
0638デフォルトの名無しさんNGNG
ではここでグーグル先生の検索ヒット時のように

 Boooooooooost!
0639デフォルトの名無しさんNGNG
Assignment, Serialization, String Algorithms
の3つでもう(*´д`*)ハァハァ
0640デフォルトの名無しさんNGNG
子供の頃、期待の新作ゲームのシステムが発表されたときの
あのワクワク感を久しぶりに味わった
0641デフォルトの名無しさんNGNG
STL初心者ですが、重複を許す双方向リストというか
グラフ図やネットワーク図のような
多対多で経路数も異なるリストを作りたいのですが
multimup系(stlport::hash_multimap)にしてValueに
prevとnextのitelatorをstd::listで持つ
という設計しか浮かばないのですが
良い方法教えて下さい
0642デフォルトの名無しさんNGNG
そんな貴方にboost::graph
0643デフォルトの名無しさんNGNG
>>641
どうやって使うかを書かないと回答のしようが無いと思いますが、
とりあえず boost::graph ではいかがでしょうか?
0644641NGNG
ありがとうございます。boostもインストールしてみました。
マルコフ連鎖を作りたいのです。しかも複数連鎖で最長Hitを基本に。
人工無脳のようなものをCで作りたいといえば良いでしょうか。
0645デフォルトの名無しさんNGNG
今週末にまたインストールするはめになる>>641なのでした
0646デフォルトの名無しさんNGNG
STLのランダムアクセスイテレータ i があって
i += hogehoge;
としたあとの i が有効かどうかは
begein() <= i < end()
と判断してOKですよね?
0647646NGNG
C++スレと間違えたけどました。
でもまあお願いします。
0648デフォルトの名無しさんNGNG
>>646
ランダムアクセスイテレータならばbegin()に直せば
begin() <= i && i < end()でよい。
0649デフォルトの名無しさんNGNG
>>648
ありがとうございます。
そもそも比較演算子が定義されているということは、と考えれば当然だと思いましたが
自信が無かったもので。
0650デフォルトの名無しさんNGNG
JAVAのBreakIteratorみたいなのないのですか?
行単位で操作とかしたいんですが
0651デフォルトの名無しさんNGNG
boost::tokenizerとか使ってみたら?
0652デフォルトの名無しさんNGNG
あとboost1.32.0から登場のstring_algoのsplitにも乞うご期待.
0653デフォルトの名無しさんNGNG
>>646-649
範囲外のイテレータの比較ってokだっけ?
i += hogehoge;する前に、
begin() - i <= hogehoge && hogehoge < end() - i
とした方がいいんじゃないだろうか。
0654646NGNG
理由はわかりませんが
プログラミング言語C++第3版(p.646)のChecked_iterではそのようになっていました。
より安全そうな事前チェックにしておきます。
0655デフォルトの名無しさんNGNG
すまんせん、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 );
0656デフォルトの名無しさんNGNG
>>653
> 範囲外のイテレータの比較ってokだっけ?
いや、駄目。
ランダムアクセスイテレータの一種であるポインタがまず駄目だし。
0657デフォルトの名無しさんNGNG
http://www.tv-asahi.co.jp/iq/
↑これの左下の問題ってさあ

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

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

現実にはまずないと思うが、仮に a がアドレス 40 番地とかに割り当てられて
たらa - 10 が NULL と一致する可能性もあるわけで。
0662658NGNG
おぉぉ勉強になります。
0663658NGNG
>>659
JIS X3010:2003(これはC99かな)しか確認できていませんがたしかに未定義と書かれていました。
JIS X3014は17000円もするのか。図書館行ってきまつ。
0664デフォルトの名無しさんNGNG
ん?18ドルだが?
http://webstore.ansi.org/ansidocstore/product.asp?sku=INCITS%2FISO%2FIEC+9899-1999
0665デフォルトの名無しさんNGNG
ちなみにC++も
http://webstore.ansi.org/ansidocstore/product.asp?sku=INCITS%2FISO%2FIEC+14882-2003
0666デフォルトの名無しさんNGNG
>>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;
  }
0667デフォルトの名無しさんNGNG
>>657
例題の一番左のやつか?
惜しいけど斜めが成り立ってないから魔法陣とはいえない
縦横だけならXORでゼロになってる

地下鉄の吊広告にもなってたね
0668デフォルトの名無しさんNGNG
>>661

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

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

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

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

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

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

思わず爆笑しちまったよ
0672デフォルトの名無しさんNGNG
boostのいう週末とはいつのことですか?
0673デフォルトの名無しさんNGNG
終末ですよ?
0674デフォルトの名無しさんNGNG
CVSから持ってきたのはドキュメントは1.32だけど、これ大丈夫なのかしら。
0675デフォルトの名無しさんNGNG
直前で差し替えとか良くあるけど大丈夫だよ
0676デフォルトの名無しさんNGNG
VC7.1 with STLPort 5.0でboost最新版をコンパイルしようと思ったんですが。
lexical_cast のところでこけます。
error C2679: 二項演算子 '>>' : 型 'boost::date_time::date_names_put<Config,charT,OutputIterator>::string_type'の右オペランドを扱う演算子が見つかりません (または変換できません)。
STLPort無しだと通ります。
どなたかSTLPortで使うときのコツ知ってたら教えてください。
0677デフォルトの名無しさんNGNG
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.

まだぁ?チン!チン!
0678デフォルトの名無しさんNGNG
もう新しい週に入っちゃってますが
0679デフォルトの名無しさんNGNG
そして週末になってインスコしたばかりのBoostを再インストールしようと
boost.orgに常駐している>>641であった orz
0680デフォルトの名無しさんNGNG
>>676
確かどっか書き換えなきゃいけなかったはず
0681デフォルトの名無しさんNGNG
>>678
タイムゾーンが JST じゃないんだよ、きっと。
0682デフォルトの名無しさんNGNG
日曜日ってまだ週末だよ?
0683デフォルトの名無しさんNGNG
カレンダーは日曜始まりのが多いけど、風潮としては週末というのは
日曜も含むっぽいね。
0684デフォルトの名無しさんNGNG
いや,正直あれの期限予告には期待せずに気長に待ったほうが・・・
何度"this weekend"っていう言葉にぬか喜びしたことか・・・
0685デフォルトの名無しさんNGNG
>>683
むしろカレンダーが特殊(由来はどこだろう?)なだけで、キリスト教的には日曜は当たり前に週末だし。
最近は週休二日制が普通だから今のカレンダーの表記だと土日が分離しちゃって分かりにくいよね。
0686デフォルトの名無しさんNGNG
国によって違います。
0687デフォルトの名無しさんNGNG
snapshot使ったらええやん
0688デフォルトの名無しさんNGNG
明らかなミスでコンパイル通らないところがいくつかあったけど。
このまま放流されちゃうのかな?
0689デフォルトの名無しさんNGNG
自動テスト通らない物はリリースしないだろ
0690デフォルトの名無しさんNGNG
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;}
0691デフォルトの名無しさんNGNG
コレクションを使いたいのですが
Keyに対してItemは沢山結び付けたいですが
multimupだと同じKeyに同じItemを追加できてしまう気がします
同じItemは重複させたくないのですがequal_range()して
foreachなりでItemを調べないと無理なんでしょうか・・
0692デフォルトの名無しさんNGNG
イマイチ理解しかねるが、
std::map<Key, std::set<Item> >
ぐらいか?

なにを持って"同じItem"というのか知らんが。
0693デフォルトの名無しさんNGNG
>>692
サンクス。こんなのに気がつかなかった漏れ・・・
吊ってきます orz
0694デフォルトの名無しさんNGNG
>>690
Boost.PPとか使ってもっと多くの引数を受け取れるようにすると面白いかもね。
逆に引数は同じでテンプレートの方を差し替えるなんてのも。
具体的な使用方法は思い浮かばないけどw
0695デフォルトの名無しさんNGNG
>>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;
}
0696デフォルトの名無しさんNGNG
>>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; };
};
0697デフォルトの名無しさんNGNG
あー,template template引数による特殊化を使って
template-nameとtemplate-argument-listに分解するんですか.これは面白い.
あとはBoost.PPの出番ですね.ちょっと作ってみようかな?
0698デフォルトの名無しさんNGNG
DRAFT tarball キター
0699697NGNG
デフォルト引数の扱いが難しい・・・.
rebind<std::vector<int>, std::string>::type
としたときに,vectorの2番目の引数(アロケータ)も一緒に書き換わって欲しいけれど
どうやれば良いのか分からない・・・.
0700デフォルトの名無しさんNGNG
>>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; };
};
これじゃあかん?
0701デフォルトの名無しさんNGNG
だせえ
0702デフォルトの名無しさんNGNG
>>695
そのようなことはちょっとソース見たかぎりじゃ確認できなかったのですが。
apply0の仕様が替わったぐらい。
0703デフォルトの名無しさんNGNG
>>695
lambdaもapplyも前からあったと思うが、どの辺が変わってるの?
0704695=699NGNG
>>700
さすがにそれはadhoc過ぎて・・・.
デフォルト引数を考慮したgenericなrebindは無理なのかも・・・.

>>702
>>703
695については自分が先走りしていただけでした.本当にすいません.
「試しにやってみたら動いちゃった」程度のものを早とちりしたようです.
0705デフォルトの名無しさんNGNG
boost::tokenizer でsepalateしてるんですが
文字が化けてしまいます
今はSJISですがWEB系のツールなのでEUC、JIS、UNICODE扱いたいです
最低でも SJISとEUCは扱いたいのだけど
馬鹿だからわかんないよ
教えて お兄ちゃん
0706デフォルトの名無しさんNGNG
WEB系ならphpかjavaにしよう
0707デフォルトの名無しさんNGNG
C++的には一旦wchar_tに変換して処理、再度適当なCharsetに変換して出力。
0708704NGNG
>>702,703
何度もすいません.やはり695は可能なようです.
いずれにせよ公式のドキュメント待ちです.
http://www.mywikinet.com/mpl/mpl_1_32_changelog.html
0709デフォルトの名無しさんNGNG
>705
ICU使って変換しる
0710デフォルトの名無しさんNGNG
ICUを使うと一気に実行ファイルサイズが10倍に?!
0711デフォルトの名無しさんNGNG
>>710
ライブラリによるだろ。
俺はバベルを使ってるが、ICUほどは増えない。
0712デフォルトの名無しさんNGNG
>>711
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
0713デフォルトの名無しさんNGNG
>>712
環kry
0714702NGNG
>>708
ごめん。ばりばりラムダつかってるわ。
どうも、寝ぼけてたみたい。orz
0715702NGNG
でもそうするとapplyとラムダをどっちを使うか迷うような気がするけど。
それとbindは・・・まぁ大丈夫か。
0716703NGNG
>>708
いや、だからMPLのlambdaは昔っから使ってる(秀和のBoost本で知った
記憶がある)が・・・どっか変わったの?applyが自動的にlambda化を
行うようになった点てこと?

メタ関数クラスの構文変更は、0引数のヤツの特殊扱いが要らなくなっ
ただけじゃなかったけ。
0717703NGNG
てかなんでageてるんだ俺。吊ってくる。
0718デフォルトの名無しさんNGNG
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
0719708NGNG
>>716
すんません.超大ボケでした.おっしゃるとおりです.
メタ関数クラスでない普通のクラステンプレートのlambda式で,
placeholderを置き換えてくれる機能は以前のバージョンからありました.
0720デフォルトの名無しさんNGNG
>718
<threading>single/multi
……だったと思う。
0721690NGNG
とりあえず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
0722デフォルトの名無しさんNGNG
boost::lambda::bind が VC7.1 で使えないことに今日気づいた・・・orz

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

所詮やつらにとっては英語以外アウトオブ眼中ってことでしょうか。
0725デフォルトの名無しさんNGNG
>>724 http://lists.boost.org/MailArchives/boost-users/msg06920.php
0726デフォルトの名無しさんNGNG
最初の方しか読むきにならなかったけどようするに作者はアンチゲイツだと言う事か。
0727デフォルトの名無しさんNGNG
>>722
インテリ切るか別のエディタ使わないとダメなんだよね。
0728デフォルトの名無しさんNGNG
>>727
なるほど、テンプレートが入り組みすぎててリソース枯渇とか
そんなところか。
0729デフォルトの名無しさんNGNG
>>724
こんな未熟なライブラリがboostに入ってるほうが不思議。
0730デフォルトの名無しさんNGNG
コネか?
0731デフォルトの名無しさんNGNG
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/.

こういうのに日本人がもっと協力してればもう少し考えてくれるかも知れない
0732デフォルトの名無しさんNGNG
その程度で協力したとは言えないような
0733デフォルトの名無しさんNGNG
ついでに次の標準でexceptionとfstreamもワイドバージョン作ってほすぃなぁ・・・。
0734デフォルトの名無しさんNGNG
wfstreamならばあるが?
0735デフォルトの名無しさんNGNG
>>734
コンストラクタの話だす。
0736デフォルトの名無しさんNGNG
?
0737デフォルトの名無しさんNGNG
>>736
basic_fstream のコンストラクタはファイル名が const char * 決めうちなんだす。
0738デフォルトの名無しさんNGNG
>>737
自分でラッパクラスつくりゃいいじゃん。と、言ってみたりする今日この頃。
0739デフォルトの名無しさんNGNG
>>738
マリーアントワネットみたいなこというなよ。
0740デフォルトの名無しさんNGNG
>738
それをやってくれるのがboostですよ。
0741デフォルトの名無しさんNGNG
ちなみに、C/C++標準ライブラリでwchar_tを受け付けてくれないのが、
ロケールの初期化とファイルオープンと例外クラス。
0742デフォルトの名無しさんNGNG
オーペン
0743デフォルトの名無しさんNGNG
>>741
(内部がどっちで実装されてるかにも拠るけど)localeはどうしようもないと思う。
0744デフォルトの名無しさんNGNG
spirit超良いね。
ためしにコマンドラインオプションを解析するの作ってみたけど、めちゃ簡単に出来た。
アクションも指定できるから正規表現より断然楽チン。
0745デフォルトの名無しさんNGNG
何を今更
0746デフォルトの名無しさんNGNG
文字列->数値もlexcal_cast使うよりreal_p使ったほうが
断然早いし。
0747デフォルトの名無しさんNGNG
つーかlexcal_castが使わせる気が無い位遅いだけ
0748デフォルトの名無しさんNGNG
>>746
詳しく
0749デフォルトの名無しさんNGNG
>>744
コマンドラインオプション解析ならprogram_options (Boost 1.32.0)もよろしく!
0750デフォルトの名無しさんNGNG
>>749
いまさらイラネ・・・とか思ったけど。
usage message 吐いてくれるのはうれしいかも。
0751デフォルトの名無しさんNGNG
>>749
poptでいいわ
0752690NGNG
http://www.boost.org/libs/mpl/doc/ref/Reference/copy.html
boost::mpl::copyのdocサンプルがコンパイルできないのですが、仕様変わったのかな?
0753デフォルトの名無しさんNGNG
コンパイラもboostのバージョンも書かないから釣り
0754デフォルトの名無しさんNGNG
>>753
釣りじゃなくてエスパー探しだろ
0755752NGNG
やっちまった...orz

copy -> foldにしたらいけました。
0756デフォルトの名無しさんNGNG
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;
の間違いだと思うんですが、
皆さんコンパイルできてます?
0757デフォルトの名無しさんNGNG
Boost+STLportを使うともれなく実行ファイルが1MB弱になりますが
これってちゃんとDLLを使用してるのでしょうか?
DynamicLinkできるなら やりかたと確認方法教えて下さい
0758デフォルトの名無しさんNGNG
こりゃ10倍どころの騒ぎじゃないな
0759デフォルトの名無しさんNGNG
>>757
で、環境は?
0760757NGNG
とりあえず今コンパイルしている環境は
Win2K、VC6.0、STLport最新リリース、ICU最新リリース、Boost先週までver
ICUはdependency walkerによるとDLLを使っている感じがしますが
BoostとSTLportはDLLを使ってるように見えませんでした。
0761757NGNG
ageちゃいましたゴメンナサイ・・
0762おしえてくださいNGNG
今日からC言語をやり始めたんですが、Borlandとかっていう無償の
ものをダウンロードして環境設定までして見ました。ここまでは
なんとかいったんですが、コンパイル法(?javaでいうとjavacみ
たいなやつ)とかも分からないし、サンプルプログラムもありません
。まだ初心者なので簡単な言葉でここから何をしたらいいか教えて
ください。
0763デフォルトの名無しさんNGNG
>>762
ゆっくり寝て、明日の朝本屋に行く。
0764デフォルトの名無しさんNGNG
>>762
http://www.kumei.ne.jp/c_lang/bcc/index.html
1/2/4章だけ読め
0765デフォルトの名無しさんNGNG
>>760
dependency walker で見て DLL を使ってないということは、ホントにスタティック
リンクしてる気が。cl に /MT オプション付けてますか?
0766デフォルトの名無しさんNGNG
大阪(西梅田)、新宿(JR駅前)のそれぞれ一等地に
拠点を構え、業績急上昇中!未経験者大募集中!の
ソフトウェア開発会社
グリーンシステムを応援するHPです。
http://www.geocities.jp/grs_hp/

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

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

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

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

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

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

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

sript>>>>>>>>>>>>>>yacc/lex/bison/flex
boost最強!!!!!!!!
みたいなのが出てこない限りは。
0782デフォルトの名無しさんNGNG
Ruby>>>>>>>>>>>BOOST
0783デフォルトの名無しさんNGNG
782が真理を突いた!
0784デフォルトの名無しさんNGNG
>775 
RACCより速そうだからいいじゃない?
0785デフォルトの名無しさんNGNG
STLの代わりとして将来標準で付くライブラリと言う点で物凄くメリットあるでしょ。
どのコンパイラ・どのプラットフォームでもソースをそのままmake出来る様になるんだから・・・
0786デフォルトの名無しさんNGNG
お前らの言う「将来標準に」って何時よw
クロスプラットフォームならおとなしくRuby使え馬鹿ども。
0787デフォルトの名無しさんNGNG
>>785
>STLの代わりとして

なぜそういう認識になるのか分からない。
BoostはSTLの代替ではなく、相互補完の関係にあると思うんだが?
0788デフォルトの名無しさんNGNG
大体メリットあるでしょって誰に反論してんだよ
0789デフォルトの名無しさんNGNG
>>782,>>783,>>786
Ruby厨キタ━━━(゚∀゚)━━━━!!
0790デフォルトの名無しさんNGNG
Rubyって遅いんでしょ
0791デフォルトの名無しさんNGNG
いまどき言語による処理速度の違いなど大した意味を持たないだろう。
専ら重要だとされているのは保守性だよね。
なるべく高速でないと困るようなアプリケーションでは相応の開発方法があるだろう
けれど、どちらかというとそういうアプリケーションは少数派だし、場合によっては
ネイティブなライブラリとして機能が提供されているでしょう?
0792デフォルトの名無しさんNGNG
よって、Rubyが最強だと愚考する次第であります。
0793デフォルトの名無しさんNGNG
そのネイティブなライブラリをRubyで書けるのか?
0794デフォルトの名無しさんNGNG
ハァ?お前ちゃんと人の話聞いてる?
0795デフォルトの名無しさんNGNG
自作ソフトにスクリプト組みたいときはRubyじゃ駄目でしょ。
0796デフォルトの名無しさんNGNG
お前にはね。
0797デフォルトの名無しさんNGNG
Rubyは素晴らしい言語。
日本人はもっと誇りに思うべきだ。
0798デフォルトの名無しさんNGNG
>>795
残念だけど、Rubyはフィルタしているんで見えないんだ。
0799デフォルトの名無しさんNGNG
>>796
フリー/シェアウェア/商用問わず、ソフトウェアに独自スクリプトを組み込みたい時に
Rubyを使えるのか?Rubyってそんなライブラリあるの?ライセンスは?
0800デフォルトの名無しさんNGNG
tuku------------------------------ru
0801デフォルトの名無しさんNGNG
>799
一応、Raccが使える……けど、

Ruby厨(に化けたアンチ)に反応するなよ
0802デフォルトの名無しさんNGNG
>>801
いやすまん、純粋な興味だ。Rubyに限らずスクリプト言語は嫌いなんで知らないんだよ。
0803デフォルトの名無しさんNGNG
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
スクリプト言語は嫌い
0804デフォルトの名無しさんNGNG
どっちも痛いな。
0805デフォルトの名無しさんNGNG
なんで C++ template スレで Ruby の議論してるんだ? そんなことより
今は Boost 1.32 が旬だろ。
0806デフォルトの名無しさんNGNG
Ruby>>>>>>>>>>>>>>>>>>>>>804
0807デフォルトの名無しさんNGNG
>>805
だっていつまで待っても出ねぇんだもん。
0808デフォルトの名無しさんNGNG
10分前に出ました。
0809デフォルトの名無しさんNGNG
http://www.meta-comm.com/engineering/boost/200411020208/boost_1_32_0.tar.bz2
ftp://ftp.ruby-lang.org/pub/ruby/ruby-1.8.1.tar.gz
http://www.meta-comm.com/engineering/boost/200411020208/boost_1_32_0.tar.gz
ftp://ftp.ruby-lang.org/pub/ruby/ruby-1.8.1.tar.gz
http://www.meta-comm.com/engineering/boost/200411020208/boost_1_32_0.zip
ftp://ftp.ruby-lang.org/pub/ruby/ruby-1.8.1.tar.gz
0810デフォルトの名無しさんNGNG
>>808
注目すべき最新の変更及び追加は?
0811デフォルトの名無しさんNGNG
kita-ってやらないのkita-って
0812デフォルトの名無しさんNGNG
809は何?
0813756NGNG
マジですか?
boost/date_time/tz_db_base.hpp 直って無いような気が・・・?
0814デフォルトの名無しさんNGNG
>>807
draft tar ball 置いてあるよ。
0815デフォルトの名無しさんNGNG
>>814
正規ってことでは
0816デフォルトの名無しさんNGNG
spiritのast_parseでCの=演算子のように右から左への結合をする方法は無いでしょうか?
ast_tree_policyのソースを見たところ問答無用で左から右に結合しているようなので
やむを得ず独自のpolicyを書きましたが、
結構長いのでバージョン間の互換性などを考えるとast_parseで出来たほうがうれしいです。
0817デフォルトの名無しさんNGNG
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;
0818デフォルトの名無しさんNGNG
>>817
typedef bind< plus<>, _1, int_<1> > b;
cout<<b::apply<int_<10> >::type::value<<endl;
0819デフォルトの名無しさんNGNG
あと

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;
0820817NGNG
>>818-819
thx.
(bind+lambda)の場合はメタ関数クラスになるから直接applyできて、
外部applyは(lambda)と(bind+lambda)の両方okと。
継承版はすっきりしてイイですね。

0821デフォルトの名無しさんNGNG
lambdaはいいとして
bindって何に使うの?
0822デフォルトの名無しさんNGNG
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)
0823デフォルトの名無しさんNGNG
カリー化だね
0824デフォルトの名無しさんNGNG
おい、俺は今なあ、英語の筆記体のrがうまく書けなくて、
それでギリシャ語の「ラムダ」に似てるから、ラムダみたいに書けばいいのかと思って
調べてみたらラムダはrじゃなくてlだったということがわかったところだぞ。
そして偶然このスレを見たらlambdaとか書いてあって驚きだよ。
これがシンクロニシティってやつなのか?
0825スレ違いだがNGNG
>>823
逆。uncurry。
0826確かにすれ違いだがNGNG
え?逆?
0827デフォルトの名無しさんNGNG
カレー食いたくなってきた
0828デフォルトの名無しさんNGNG
>824
てゆうかガンマでそ
0829デフォルトの名無しさんNGNG
>>828

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

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

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;
}
0844デフォルトの名無しさんNGNG
>838
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999294620&res=159&fi=no
インライン化を諦めるならこういうやり方もあるにはあるんですが・・・.
0845デフォルトの名無しさんNGNG
>>843
このスレ的に、EnumWindowsはSTLSoft使って欲しい。
0846デフォルトの名無しさんNGNG
>>838
つい最近cppllに出てたもの
ttp://www.tietew.jp/cppll/archive/11286
0847デフォルトの名無しさんNGNG
>>846
内部関数から親関数のローカル変数って参照できる?

そういやPascalってどうなんだろ
たしか内部関数作れるんだよね。
0848デフォルトの名無しさんNGNG
>>846
ただの内部関数はそれこそイディオムが成立するくらい誰でも出来るのです。
このスレ的にはテンプレート化することが重要なのれす。
0849デフォルトの名無しさんNGNG
Pascalはスタックポインタ、フレームポインタとは別のレジスタを保存して
静的スコープの外側へのリンクを張りながら呼び出すんで。
0850デフォルトの名無しさんNGNG
>>846
ただの関数ポインタとして扱われるからリンケージが関係なくなるのかな
0851デフォルトの名無しさんNGNG
>>847
846さんの方法だと無理です.
local functorなら参照したいローカル変数のポインタを明示的に渡すことで,
一応可能にはなると思います.
0852デフォルトの名無しさんNGNG
>>851
functorだとテンプレート引数に出来ないというジレンマ
0853デフォルトの名無しさんNGNG
>>847
元の関数がメンバ関数だと使えない手法だけど、
ttp://www.tietew.jp/cppll/archive/2507
みたく関数をクラス化してしまうのはどう?
元の関数でローカル変数だったものはメンバ変数にしてしまえば
当然だけどメンバ関数から利用可能だし。
0854デフォルトの名無しさんNGNG
>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;
}
0855デフォルトの名無しさんNGNG
>>854
関数内関数を作ったつもりだろうけど結局static関数をつくったら意味が無いという罠だけどね
0856デフォルトの名無しさんNGNG
static関数だとなんで意味無いの?
0857デフォルトの名無しさんNGNG
>856
インライン展開されないんじゃない?
0858デフォルトの名無しさんNGNG
>>847
inner関数が実行されている時は、
outer関数も実行されている時。
これは関数のスコープ規則によって必ず約束される。

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

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

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

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

//c:\test error
//c:/test error
0865デフォルトの名無しさんNGNG
>>864
ttp://www.boost.org/libs/filesystem/doc/portability_guide.htm#name_check-_functions
0866デフォルトの名無しさんNGNG
Javaはfinal指定しておけば関数の外に出てからも参照できるね。
0867デフォルトの名無しさんNGNG
"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"
0868デフォルトの名無しさんNGNG
ま、"c:\\test"だわな。
0869デフォルトの名無しさんNGNG
質問です

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()時に失敗してしまいます

これを解決する方法があれば教えてください
0870デフォルトの名無しさんNGNG
>>869
おもしろくない。
0871デフォルトの名無しさんNGNG
>>869
それコンパイル通らねえだろ。
0872デフォルトの名無しさんNGNG
コードがメチャクチャだし、テンプレート引数がHoge*なのもおかしい
0873デフォルトの名無しさんNGNG
書き直します

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 ); のように
別のデータを追加していきたいと考えているのですが…
0874デフォルトの名無しさんNGNG
>>873
boost::shared_ptrの使い方をもう一回調べて来い
0875デフォルトの名無しさんNGNG
そもそもshared_ptrとはなんぞやから調べたほうが良いと思う。
0876デフォルトの名無しさんNGNG
> typedef boost::shared_ptr<Hoge*> pHoge;

typedef boost::shared_ptr<Hoge> pHoge;
ちゃうんかと。
0877デフォルトの名無しさんNGNG
>>876
それはわかっとる。それに、気づくのが遅いよ君。
0878デフォルトの名無しさんNGNG
やれやれ
0879デフォルトの名無しさんNGNG
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入力するの面倒な気が...
0880デフォルトの名無しさんNGNG
>>879
そんな駄目ライブラリは窓から投げ捨てろ
0881デフォルトの名無しさんNGNG
>>880
CUIならいいのー? にゃんにゃん
0882デフォルトの名無しさんNGNG
>>881
CUIでも窓なら駄目。
0883デフォルトの名無しさんNGNG
boost::filesystemの作者がアンチM$だしな
0884デフォルトの名無しさんNGNG
アンチMSとかの問題じゃなくてスペース含んだパスの取り扱いの問題だろ?
試してないがスペースをエスケープすればいいんでないの?
0885デフォルトの名無しさんNGNG
>>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
0886デフォルトの名無しさんNGNG
どっちにしろマルチバイト文字扱えないんだからWindowsじゃ使えないだろ
0887デフォルトの名無しさんNGNG
Rubydesubetekaiketu !!!!!!!!!!!!!!!
0888879NGNG
>>885
thanks.
そんな方法があったとは...

>>886
separatorと検出する方法(MBCSを使う)を
外部指定できれば、可能性ないかな?
0889デフォルトの名無しさんNGNG
唯一、MBCSのことを考えてくれたMicrosoftも.NETに移行だし、
もう、C++でMBCSというのは、完全に無いんだろうな。
0890デフォルトの名無しさんNGNG
>>889
C++/CLI
0891デフォルトの名無しさんNGNG
>>888
マルチバイト対応もワイドキャラクタ対応も数時間あれば出来るようなことだが
作者にその気がないのでしょうがない。
0892デフォルトの名無しさんNGNG
>>891
ほんとにやる気ないの?
ttp://article.gmane.org/gmane.comp.lib.boost.devel/113105
0893デフォルトの名無しさんNGNG
どうせboost::filesystemなんて標準には含まれないのは分ってるんだから
どっちでもいいのでは。使いたくないのなら使わなきゃいいだけなのでは
0894デフォルトの名無しさんNGNG
>>893
なんで分かってるの?
0895デフォルトの名無しさんNGNG
>>894
C++を動かす環境にファイルシステムがあるとは限らないから。
0896デフォルトの名無しさんNGNG
fopenとかfstreamとかどうなるんだ
0897デフォルトの名無しさんNGNG
標準のfopenやfstreamは名前を指定してストリームを作成する汎用の手段を提供してるに過ぎない。
開くストリームは例えば特定のメモリ領域に名前をつけたものだったり、
極端な話WebページをGETしてもいい。
ファイルシステムとは違う。
0898デフォルトの名無しさんNGNG
現状含まれていないのを根拠に、将来含まれないのが分かってるというのかね?
0899デフォルトの名無しさんNGNG
>897
へりくつー
0900デフォルトの名無しさんNGNG
>>899
無知ー
0901デフォルトの名無しさんNGNG
>>895
freestanding と hosted environment をゴッチャにしてないか?
0902デフォルトの名無しさんNGNG
おとうさまー
0903デフォルトの名無しさんNGNG
(棒読み)
0904デフォルトの名無しさんNGNG
マルチバイトじゃパラメタライズできんから、
テンプレートマクロ集というカテゴリで出すにはふさわしくないだけでしょ。
出すならまた別のライブラリに含める形で。
0905デフォルトの名無しさんNGNG
結論: 日本語をちゃんと扱いたきゃRubyを使え馬鹿ども
0906デフォルトの名無しさんNGNG
>>904
> マルチバイトじゃパラメタライズできんから、

君、レベル低すぎ。

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

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

「だから」って…アフォだろ。
0911デフォルトの名無しさんNGNG
char|wchar_tみたいな特別な型を作り出すのは無理?
BOOST_STRONG_TYPEDEF(char,mbc);
char str[] = "123";
mbc mbs[] = "123";//error
0912デフォルトの名無しさんNGNG
typedef singned char EUCCHAR;
typedef unsigned char SJISCHAR;
これならできるんじゃないか?
0913デフォルトの名無しさんNGNG
えー
0914デフォルトの名無しさんNGNG
>>903
まさかスルーされてないとは思わなかったよありが�dw
0915デフォルトの名無しさんNGNG
>>907
basic_stringですら既にfindとかはパラメタライズされているような。
0916デフォルトの名無しさんNGNG
>>911>>912
何故そのレベルでやろうとするんだ…

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

とはいえ今後需要は少なそうだね。
0917デフォルトの名無しさんNGNG
>>910-912
このへんはネタだと思いたい。
0918デフォルトの名無しさんNGNG
boost 1.32 ブランチトジターョ
0919デフォルトの名無しさんNGNG
wchar_tにしてまでMBCS扱いたくないよな・・・でもサロゲートが・・・。
MSはもうWCHAR=2バイトにしちゃったからこれからずっと2バイトなんだろうな。
DCHAR=4バイトとか出してきそうで怖いな。
0920デフォルトの名無しさんNGNG
www.boost.org 更新キター
A targeted release date is November 17.
0921デフォルトの名無しさんNGNG
またコンパイルし直しかなあ。
boostライブラリのコンパイルはpchとか作ってくれないから時間かかるんだよなあ。
0922デフォルトの名無しさんNGNG
hash_mapの中身を保存したいんだけど別アイテムへの自己参照してるんだけど
良い方法ないっすかね〜?
シリアライズまだ?
0923デフォルトの名無しさんNGNG
>>922
draftから引っ張り出せばいいよ。
0924デフォルトの名無しさんNGNG
aleksey.jpg ワロタ
0925デフォルトの名無しさんNGNG
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)

0926925NGNG
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!!
やっぱだめぽ
0927デフォルトの名無しさんNGNG
>>926
friend class T; でもだめか?
0928925NGNG
>>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
0929デフォルトの名無しさんNGNG
C++Primer第3版日本語版P865〜866
クラステンプレートにおけるfriend宣言を見ると、
テンプレート・パラメータはfriendクラスそのものには使えないが、friendクラス
のテンプレート・パラメータの方を指定する事ができる。

例

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

template <typename T>
class A {
 friend class Foo<T>;
};
0930デフォルトの名無しさんNGNG
>>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;
};
0931925=928NGNG
>>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)
};
0932デフォルトの名無しさんNGNG
>>931
君にはC++Templatesをお勧めしよう。
大きな声では言えないが、CHMやPDFはよく探せばどこにでも落ちている。
俺は画面で見るのが嫌なのでAMAZONで買ったが。
しかしこんな名著がなぜ日本語訳化されないのか不思議。
0933デフォルトの名無しさんNGNG
これ読んだ人はいますか?
C++ Template Metaprogramming
: Concepts, Tools, and Techniques from Boost and Beyond
http://www.amazon.com/exec/obidos/tg/detail/-/0321227255/
0934デフォルトの名無しさんNGNG
>>933
まだだけど内容が偏ってそうなタイトルだな。
0935デフォルトの名無しさんNGNG
著者がboostの中の人
http://www.boost.org/people/dave_abrahams.htm
http://www.boost.org/people/aleksey_gurtovoy.htm

0936936NGNG

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内をいじくらずにコンパイルをとおすにはどうしたらいいですか?
0937デフォルトの名無しさんNGNG
>>936のコードをBCCでやろうとしたらできちゃった。
これじゃ俺には答えられん。OTL
0938デフォルトの名無しさんNGNG
>>936
お前がやりたいのはこれか?

template <typename FP>
struct A;

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

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

>>936
ですか?
そのコードはprimary templateとその特殊化で非型パラメータの型が異っていて
(void (*)()とR (*)()),そういう特殊化は許されないです.
なのでmain関数をいじらずにそれを通すのは無理と思います.
見たところ,関数ポインタからその戻り値がvoidかどうかを判別する静的整数値が
欲しいと見受けられますが,その解釈で良いですか?
0940デフォルトの名無しさんNGNG
STLPortってシリアライズ対応してるんですか?
みあたらないのですが・・・・・
0941936NGNG
>>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;
}
0942デフォルトの名無しさんNGNG
>>941
それは無理。
typeofが使える環境ならいいけど。
0943デフォルトの名無しさんNGNG
gcc3.2 3.3 3.4 以降 の libstdc++ と、STLportでは、どっち使ってます?
gcc も version 3から、c++ 対応が強化されてますし。

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

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

でもSTLport のほうが速いのかな。
0944デフォルトの名無しさんNGNG
STLPortのデバッグモードがいいよ
0945デフォルトの名無しさんNGNG
>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を実現するってヤツなんですけどね.
0946デフォルトの名無しさんNGNG
boost1.32.0 2004-11-19 18:47
キタ━━━━(゚∀゚)━━━━!!
ttp://sourceforge.net/project/showfiles.php?group_id=7586
0947デフォルトの名無しさんNGNG
boost1.32.0キタ━━━━(゚∀゚)━━━━!!
0948Booster達の午後^H^H週末NGNG
boost1.32.0やっとキタ━━━━(゚∀゚)━━━━!!
0949デフォルトの名無しさんNGNG
おまえら気づくのおせーよw
0950デフォルトの名無しさんNGNG
タグは打たれないのかい?
0951デフォルトの名無しさんNGNG
すみません、質問があります。
boostのファンクタを使ってみようと思っているのですが、
脳がこんがらがってきました。

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

ところが、コンテナの中身がweak_ptrなので、一度lock()しないといけません。
こういう場合、どういうファンクタを書けばいいのでしょうか?
出来ればlambdaを使わず(怖すぎ)、bindやmem_fnだけで書く方法を
教えていただけないでしょうか。
0952951NGNG
誰か答えろよ。
0953デフォルトの名無しさんNGNG
頭がこんがらがるようなことはやらないが吉。
0954デフォルトの名無しさんNGNG
0955デフォルトの名無しさんNGNG
誰だよ昨晩から上げ荒らしをしているばかは。一応通報したからね。
0956デフォルトの名無しさんNGNG
>>952
解っているがおまえの態度が気に入らない。
0957デフォルトの名無しさんNGNG
>>955
どうやらRuby信者の荒らしみたい
0958デフォルトの名無しさんNGNG
boost lambda で再帰ってどう書けばいいのかな?
0959デフォルトの名無しさんNGNG
>>958
具体例プリーズ
0960デフォルトの名無しさんNGNG
>>958
試してないけどboost::functionも使ってこんな感じで行けない?
function<int (int)> f= ret<int>(if_(_1==0)[1].else_[_1*f(_1-1)]);
cout<< f(5)<< endl;
0961デフォルトの名無しさんNGNG
boostの悪い使い方の典型だな
0962958NGNG
>>960
function<int (int)> f= ret<int>
(if_then_else_return(_1==1,1,_1*f(_1-1)));
とかもやってみたけど駄目みたい。(再帰はムリなのかもしれぬ...


0963デフォルトの名無しさんNGNG
ここまでしてlambda使いたいか?て思う
半年ぐらいC++から離れたら読めなくならない?
0964デフォルトの名無しさんNGNG
>>962
fの呼び出しはbindで包まないとだめだと思うが。
俺の環境ではif_then_elseが使えないから、
function<int (int)> f= bind<int>(var(f), _1);
で、スタックオーバーフローを確認した。
0965デフォルトの名無しさんNGNG
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で書き直すとどうなるの?
0966デフォルトの名無しさんNGNG
>>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));
}
0967デフォルトの名無しさんNGNG
マジでboostからlambdaはずして欲しい。
0968デフォルトの名無しさんNGNG
>>967
使わなければいいのでは?
0969デフォルトの名無しさんNGNG
俺が使わなくても他のやつが使うじゃん。
俺そんなの読むのヤだよ。
って実際lambda使ってるやつ見たことないけど。
0970デフォルトの名無しさんNGNG
勝手だなぁw
0971デフォルトの名無しさんNGNG
lambda を馬鹿みたいに多用する奴がアホなだけだからなま暖かく見守っとけば?
0972デフォルトの名無しさんNGNG
boost自体がお遊びでしょ
0973デフォルトの名無しさんNGNG
boost見てると
「でっきる〜かな、でっきる〜かな♪」
と聞こえてくるんですが。
0974デフォルトの名無しさんNGNG
>>973
「さてさて、ふふ〜ん」ってか
0975デフォルトの名無しさんNGNG
ほんとうに聞こえてくるなら病院に行ったほうがいいかと。
0976デフォルトの名無しさんNGNG
C++にlambdaがないのがいけないんだよ。
Perlにすらあるのに。
0977デフォルトの名無しさんNGNG
lambdaは予約語だからな。使わないようにしておかないと。
0978デフォルトの名無しさんNGNG
正直、templateのdraft最初みた時、これほどの盛り上がりになるとは…
0979デフォルトの名無しさんNGNG
>977
ちょっとドキッとして調べちゃったじゃないかよ
0980デフォルトの名無しさんNGNG
昔ランバダにドキドキした
0981デフォルトの名無しさんNGNG
D言語のfunctionってダサいよな。やっぱlambdaだべ。
0982デフォルトの名無しさんNGNG
次スレ立ててきて良いですか?立てますよね?立てますよ?
0983デフォルトの名無しさんNGNG
オレのことより、オマエ自身はそれでいいのかよ!?
0984デフォルトの名無しさんNGNG
俺に構わず逃げろ!
0985デフォルトの名無しさんNGNG
立てました

【C++】template 統合スレ -- Part6
http://pc5.2ch.net/test/read.cgi/tech/1101384692/
レス数が950を超えています。1000を超えると書き込みができなくなります。