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

Generic Programming with C++ Template

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
C++ による Generic Programming の話をしよう。

参考図書:
Modern C++ Design
Andrei Alexandrescu, Addison-Wesley, ISBN:0-201-70431-5
(訳書: ピアソン・エデュケーション, ISBN:4-89471-435-3)
http://cseng.aw.com/book/0,,0201704315,00.html

Generic Programming - STL による汎用プログラミング
Matthew H. Austern, ASCII, ISBN:4-7561-3441-6

関連スレッド:
C++相談室 Part3
http://pc.2ch.net/test/read.cgi/tech/1003832761/

STL スレッド
http://pc.2ch.net/test/read.cgi/tech/1004287394/
0243241NGNG
静的型付け言語としてあれが精一杯だと思うけどどうだろ。
マクロの部分ならなんとかなるかもしれないけど。
0244デフォルトの名無しさんNGNG
(´・ω・`)ショボーン
0245デフォルトの名無しさんNGNG
>>242
Andrei Alexandrescu にも無理(だった)

>>240
どうでもいいが Loli じゃなくて Loki な。
0246デフォルトの名無しさんNGNG
Lokiは標準に準拠したコンパイラなら通らなければいけないコードなんですか?
0247デフォルトの名無しさんNGNG
C++がRubyにまさっている天安か有る?
0248デフォルトの名無しさんNGNG
>>247
ありません、ごめんなさい
0249デフォルトの名無しさんNGNG
やたああああああああああああああああああああああああああああああああ
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> C++
0250デフォルトの名無しさんNGNG
Ruby!!!!!!!!!!!
0251Rubyは好きだけど、比べることは不毛だ。NGNG
無いと > なのか?
= って可能性は無いわけ?
0252デフォルトの名無しさんNGNG
ロリ>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Loki
0253デフォルトの名無しさんNGNG
>>251
たぶん operator>>>>>>>>...() だから stream から入力してるんだと思うが。
0254デフォルトの名無しさんNGNG
頼むからレス付けないでくれ。
別スレが丁度あるじゃん。
0255デフォルトの名無しさんNGNG
>>253
いや、激しくビットシフトしてるんだと思うぞ。
0256デフォルトの名無しさんNGNG
シフトしてる数は少ないけど、ビットシフトの勢いは激しいのかも。
はしっこのビットがはみ出すくらいに・・・
0257デフォルトの名無しさんNGNG
STLはインライン展開しまくってくれるのがどうも。。。。
確かに画期的だとは思うのだけど。

インラインしてくれる分、それだけコードは早くなるんだけどね。
0258デフォルトの名無しさんNGNG
>>257
コンパイラのオプションをいじって、最適化を「速度優先」から「サイズ優先」
に変更しましょう。インライン展開が、かなりの程度まで抑制されます。
0259デフォルトの名無しさんNGNG
>>257
全く変化なしでしたよ。
0260デフォルトの名無しさんNGNG
>>259
ちがった。
>>258
全く変化なしでしたよ。
0261デフォルトの名無しさんNGNG
>>257
最近のCPUではインラインしすぎはかえって遅くなることが
あるんで、よろしく。STLに限った話じゃないけども。
0262デフォルトの名無しさんNGNG
STL
0263デフォルトの名無しさんNGNG
WTLで、メッセージハンドラがマクロ内に
インライン展開されてたのにはびっくりした。
0264デフォルトの名無しさんNGNG
>>263
そりゃマクロだからインライン展開するわな。
つうかマクロをインライン展開というのかは微妙
# あれにびっくりしたのには同意。
0265263NGNG
class Hoge : public CWindowImpl<Hoge>{
BEGIN_MSG_HANDLER(Hoge)
MESSAGE_HANDLER( WM_HOGE ,OnHoge ) 
//OnHogeがここにinline展開される
MESSAGE_HANDLER( WM_HOGE2 ,OnHoge2 ) 
//OnHoge2はここにinline展開される
END_MSG_HANDLER()
LRESULT OnHoge(){...} //ここではbpかけられない
LRESULT OnHoge2(){...}
};
0266デフォルトの名無しさんNGNG
>>265
そんなあなたに

__asm { int 3 }

(っつー話じゃないか)
0267デフォルトの名無しさんNGNG
Alexandrescuってさなんかデザパタの著者とかEffectiveやExceptionalの
著者に遠慮して本書いてないか?modern~はとても実践的な本だけど、もっとTypelistに
特化した馬鹿みたいなオタク本を書いて欲しいところだな。
0268デフォルトの名無しさんNGNG
もっと色んな実例を集めて紹介してほしかったりする。>Alexandrescu
彼のWebページは何だかな。
0269デフォルトの名無しさんNGNG
>>268
いやWebで公開するには惜しいアイディアがあるんだろ。
more modernが出るのをひたすら待つのみ
0270デフォルトの名無しさんNGNG
んなもん読む暇あったらChristopher Alexanderの著作嫁
Alexandrescuは彼のパクリ
0271デフォルトの名無しさんNGNG
>>270
知ったかしてます?
なんか具体的なこと語ってみてよ
0272デフォルトの名無しさんNGNG
Alexandrescuのテクニックはパターンの実装においても
使えるけど、それ以外のことにも可能性がある点が面白いわけで
270のような奴はそもそも勘違いしてるんだろな。
0273デフォルトの名無しさんNGNG
Functorのサンプルコード、g++3.0で動いた人いますか?
なんかローダーがエラー返してくる。。
0274デフォルトの名無しさんNGNG
ああ、すまそ。SmallObj.cppをコンパイルするの忘れてた。失礼!
0275デフォルトの名無しさんNGNG
>>164
下の本注文しますた!
0276デフォルトの名無しさんNGNG
テンプレートあげ!
0277デフォルトの名無しさんNGNG
VCのtemplateの限界がわからん。
何処まで許されているのだ?
0278デフォルトの名無しさんNGNG
VCなんて捨て捨て。
これからはC++コンパイラといえばG++を指します。
0279デフォルトの名無しさんNGNG
G++って何ですか?
VC、BCB、gccしか知らないものですから・・・。
0280デフォルトの名無しさんNGNG
gccのC++コンパイラがg++。
0281デフォルトの名無しさんNGNG
>>280
しかし g++ と G++ は、かなり違う気がするが。(特に UNIX だと)
0282デフォルトの名無しさんNGNG
g++はいいんだけど、autoconf,automakeの使い方覚えるのが
偉い大変だよな。みんなあれをすんなり覚えられた?
0283仕様書無しさんNGNG
CppTestつかいながら覚えるとよい。
0284デフォルトの名無しさんNGNG
最近のg++は、単にC++用のオプションをつけてgccを呼び出すスクリプトです。
0285デフォルトの名無しさんNGNG
あげ
0286デフォルトの名無しさんNGNG
>>284
(゚Д゚)ハァ?
0287284NGNG
>>286
>>280に言ってるんだけど、なにか?
0288デフォルトの名無しさんNGNG
スクリプトじゃなくてバイナリの実行ファイルになってるけど
0289デフォルトの名無しさんNGNG
$ man g++

G++(1) GNU Tools G++(1)

名称
g++ - GNU プロジェクト C++ コンパイラ (v2.4)

書式
g++ [option | filename ]...

解説
C コンパイラおよび C++ コンパイラは統合されました。 g++ は
gcc に C++ を解釈するようにするオプションをつけてコール す
るスクリプトです。詳細は英語版のオンラインマニュアルおよび
gcc(1) を参照して下さい。
0290 NGNG
>>289
情報が古いと思われ。っつーか基本的にスレ違いだよな、この話題。
0291デフォルトの名無しさんNGNG
でも現実的に今、Lokiが使えるC++コンパイラといえば
gccかCodeWarriorぐらい。
しかたがないね。

CodeWarriorかおか?
0292デフォルトの名無しさんNGNG
ついでにこっちもあげ
0293デフォルトの名無しさんNGNG
VC6でBCCで使える様にLokiを修正できないの?
0294デフォルトの名無しさんNGNG
そんな糞は捨て捨て
gcc使いなさい。
0295デフォルトの名無しさんNGNG
糞クソ言わないでヨ!
(`ε’)プンプン
0296デフォルトの名無しさんNGNG
>>293
できん。
特にVCでは不可能。

BCCでも機能が足りん。
テンプレートクラスの中でテンプレートクラスが宣言できない。
T1 < T2 < T3, T4 >, T5 >みたいな複雑なテンプレートの特殊化ができない。
これじゃねー。
0297デフォルトの名無しさんNGNG
面白さと革新さは認めるけどVCで使えないんじゃ
はっきり言ってただのオナニーコードじゃん
GCCだけで閉じられてる商用プロジェクトなんてあんまり
ないんじゃないかと思うがどうよ?
結局現時点では実践向きじゃないって事?
0298デフォルトの名無しさんNGNG
>>296
それができるとどんな利点があるの?
0299デフォルトの名無しさんNGNG
>特にVCでは不可能。
>BCCでも機能が足りん。
これってテンプレートの限界を表わしてるよね。
これじゃ実用にならない。
0300デフォルトの名無しさん NGNG
300get!

>>298
テンプレートパラメータとしてタイプリストを
作りそのリスト値から任意の型を取り出せる。

>>299
vs7のコンパイラならいけるらしい。
それにlokiはansic++準拠だよ
テンプレートの限界じゃなくて
コンパイラメーカーの限界
0301デフォルトの名無しさんNGNG
理解できない→「んなもん、実用にならんわい」といいたくなる罠。

と、マンネリな煽りはさておいてvcも7.1で対応させるとか、させないとか。
0302デフォルトの名無しさんNGNG
>GCCだけで閉じられてる商用プロジェクトなんてあんまり
うふ♪
0303デフォルトの名無しさんNGNG
p.210で、
素のC++だと、"Deriverd" という文字列からDeriverd型のオブジェクトを作成できなくて
云々とあるけど、この本のどのへんのコードを見れば文字列からオブジェクト生成するのが楽に
汎用的にできるのかがさっぱりわかんない俺はガス管くわえて死んだ方が世の中の為ですか?
0304デフォルトの名無しさんNGNG
>>303
コンパイラの内部表現としての型と
コードに記された型名の違いということではなくて?
0305デフォルトの名無しさんNGNG
name mangling の話…? は余り関係ないように思われ
0306296NGNG
>>298
本を読んでから、返事をください。
先の例より複雑なテンプレートがいっぱい出てきます。

>>303
本の例とは逆に
template < class T > class GetClassNameAble{
char* getClassname() { return T; }
}
みたいなことができても面白いと思われ。
0307デフォルトの名無しさんNGNG
>>306
そんなのいみねー
文字列からクラスを生成(Reflection)できると便利だが(構造上&仕様上不可能なのは承知)
>>306の例だとほとんど使う意味がない
0308デフォルトの名無しさんNGNG
>>306
> 本を読んでから、返事をください。
> 先の例より複雑なテンプレートがいっぱい出てきます。

了解しますた。もっと勉強します。
0309デフォルトの名無しさんNGNG
>>299
「実用」の定義によるな。gcc で仕事してる人間には実用レベルだし、Win32
アプリケーションを VC6 で書いてる人間には使い物にならん。

ただ、VC も BCC もいずれ ANSI C++ 準拠してくるだろうから、そのときに
使える選択肢が一つ増えるって事で。

(そういや Boost に Loki 入れようという話、どうなってる?)
0310デフォルトの名無しさんNGNG
SHをターゲットとしたプログラムにタイプリストが使われまくり、
Windows上のプログラムでは未だに従来のデザパタのサンプルコード
みたいなのが使われてるなんて、、、なんか違和感あるなw
0311デフォルトの名無しさんNGNG
>>306
クラス名を文字列化するのは typeid(T).name() で出来るし。別に面白くもなんとも。
0312303NGNG
で…どんなかんじ?
神。
0313296=306NGNG
>>311
この例、面白くなーい?
残念だなー。

>>307
const char*なら、いけるんじゃない?
もしくはコンパイラが自動的にFactoryを作ってくれるというのも
面白いかも。
というかTypeListで作れるか。あはははは。
0314デフォルトの名無しさんNGNG
>>313
つくって。
0315 NGNG
>>309
>(そういや Boost に Loki 入れようという話、どうなってる?)
って初耳なんだけど、本当なの?
誰か情報キボンヌ
0316デフォルトの名無しさんNGNG
ちょっと考えてみましたけども、sizeof(クラス)と、
そのクラスのコンストラクタのアドレスがわかれば、
実行時にダイナミックにクラスの作成できるかな?

実装依存(コンパイラ依存)なら書けるでしょうか?
0317デフォルトの名無しさんNGNG
LLが入りそうってのはどっかで見聞きしたなぁ。
0318デフォルトの名無しさんNGNG
>>315
Boost の開発者 ML で議論してる。スレッド長いから追ってないけど
Andrei Alexandrescu も話に参加してる模様。

(メールアドレスが @hotmail.com だけど)
0319デフォルトの名無しさんNGNG
>>316
実装依存って言ったらそれこそなんでもありやん
0320デフォルトの名無しさんNGNG
>>319
そそ、ダイナミックにソース作って、コンパイラ起動して、できたプログ
ラムに制御渡しゃどんなクラスでもできるぞ。
0321315NGNG
>>318
boost-dev(?) の ML 読んでんの?すげー。
所詮俺は厨房である事を再確認した・・・
cppmlぐらいなら分かるんだけどさすがにそんなところ
まで手は伸ばせんわ・・・

独り言sage
0322デフォルトの名無しさんNGNG
>>321
> boost-dev(?) の ML 読んでんの?すげー。
全部は追ってないし、開発にも参加してない。必要そうなヤツだけ斜め読み
だよ。(C++ は仕事道具だし)

Boost -- Boost mailing list
http://lists.boost.org/mailman/listinfo.cgi/boost

> cppmlぐらいなら分かるんだけどさすがにそんなところ
cppml ではなくて cppll かしらん?

俺は cppll は最初は読んでたんだが、エピスが検定試験云々言い始めた頃に
S/N 比が許容値を下回ったので切った。最近はどうなん?>読んでる人
0323デフォルトの名無しさんNGNG
>>322
cppIIは今も取ってるが未読が1253通(藁
全然読んでないよ。
エピス氏はコード出して技術的な話をしているうちはいいが、
取り巻きも含めて雑談モードに入るとうるさいからな。

重鎮扱いで誰もつっこめないし。
0324デフォルトの名無しさんNGNG
>>323
俺も彼の言語感覚についていけないクチだね…
自動で s/ぢ/じ/g してから読めば少しはマシになるかな(w
0325デフォルトの名無しさんNGNG
うむ。
10代、せめて20代前半ならまだ許せるが、
某本で素顔の写真見ちゃったからなぁ・・・
0326デフォルトの名無しさんNGNG
あの写真はショックだったという人
わりといますね。典型的な(略)
0327デフォルトの名無しさんNGNG
だれかvcppかcppIIでエピス当てにうざいってレス付けてくれないか。
漏れは怖くてできない

電柱○家
Tit○w
あ○る

あたりが突っ込んできそうだな。
「いきなり出てきてあんたの方が役に立ってない」とかいいながら。
0328デフォルトの名無しさんNGNG
すとーるまんみたいな感じ?
0329デフォルトの名無しさんNGNG
全然。
0330デフォルトの名無しさんNGNG
テンプレートと
http://www.csg.is.titech.ac.jp/~chiba/opencxx/html/index.html
これとの組合せでたのしいことになったりしませんか?
0331デフォルトの名無しさんNGNG
>>330
なにこれ?
0332デフォルトの名無しさんNGNG
C++でリフレクションが使えるようになる(前)処理系
0333デフォルトの名無しさんNGNG
>>322
あのMLでは「低いS/Nの中からいかに情報を取り出すか」というのも重要なテーマです(藁
うまいフィルタ作れないかな。もちろんcppで。
0334デフォルトの名無しさんNGNG
C++ Builderってバージョンあがってもう少し使えるようになるかと思ったら
テンプレート周辺にバグがあるんでしょ?がっかり。
しっかりしてくれよ、Borland。期待してるんだから。Pascal以外の言語もがんばってくれよ。
0335デフォルトの名無しさんNGNG
>>334
えっ?初耳。ソースはどこかにありますか?教えて下さい
0336デフォルトの名無しさんNGNG
>>333
struct pr : public std::binary_function< string, string, bool>{
bool operator()(const string& x, const string& y)const{
return search(x.begin(), x.end(), y.begin(), y.end()) != x.end();
}
};

vector<string> articles;
・・・

articles.erase(remove_if(articles.begin(), articles.end(), bind2nd(pr(), "ぢ")), articles.end());
articles.erase(remove_if(articles.begin(), articles.end(), bind2nd(pr(), "ちう")), articles.end());
0337デフォルトの名無しさんNGNG
いっそのこと、
articles.erase(remove_if(articles.begin(), articles.end(), bind2nd(pr(), "FUKUDA Fumiki")), articles.end());
で。

0338デフォルトの名無しさんNGNG
>>334
えっ?猫耳。
0339デフォルトの名無しさんNGNG
>>338
えっ?愛猫。
0340デフォルトの名無しさんNGNG
>338-339
つまんねーよきみら
0341デフォルトの名無しさんNGNG
http://osl.iu.edu/~tveldhui/papers/Template-Metaprograms/meta-art.html

すごい!!
0342デフォルトの名無しさんNGNG
VC7へぼい・・

template<class T> void swap(T& x, T& y) {}
template<class T> void swap(vector<T>& x, vector<T>& y) {}

これコンパイル通らないんだよね・・
プログラミング言語C++ではこういう書き方してるのに。
■ このスレッドは過去ログ倉庫に格納されています