トップページ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/
0175172NGNG
>>173
もちろん無駄だといってる訳ではない。
ModernC++Designを読んでる最中にHaskellに出会って
今、はまりまくってるよ。
そのせいか、STLもパラメータ化クラス(型?)を使いまくってる性で
関数言語風味たっぷりに感じてるよ。
どれくらい嵌ってるかというと、関数プログラミングからホーアCSP理論まで読んで
「ほー、Eiffelの表明の元ネタは仕様記述言語Zから来てたのは知ってるけど
そのZ言語の元ネタはCSP理論なんかー。おもしれーなー。
表明の推論もできそうだなー」とか訳のわからんことを考えるくらい嵌ってる。

ただ、この手のネタは、この板の主旨から結構ズレてしまったのでは?
と思うわけよ。

>>174
これも面白いと思う。
非正格言語でtemplateみたいなコンパイル時簡約?みたいなことが
出来たら実行速度が手続き型言語に勝てる関数型言語も夢では無いかもしれない
と俺は創造してしまう。
(CleanやMLは代入使って実行速度を上げてるようだが、そんなセコイことせずにな)

でも、なーtemplateは形検査してくれないからなー。
ModernC++Designの技はやり過ぎだと思う。
ハッタリには使えると漏れも思う。
(研究する価値が無いというつもりは無い。そこは酌んでほしい)
0176デフォルトの名無しさんNGNG
>>172
やっぱり実践的なプログラムにあれは使うものじゃないよね。
Cの変なテクニックを積み重ねたようなプログラムなんて物凄く
読みにくいけど、それの上を逝ってるよ。
0177デフォルトの名無しさんNGNG
あれは「上には上がいるもんだが、ここまでやっちゃあいかん」という見本だ。
頭の体操には悪くないが。
0178デフォルトの名無しさんNGNG
COBOLでオブジェクト指向、みたいな話になってる気がする
0179デフォルトの名無しさんNGNG
まぁでも実際に使ってみないことにはなんとも言えないね。
0180デフォルトの名無しさんNGNG
テンプレートの特殊化に対する適合アルゴリズムについて詳しく解説してる
サイト、キボーン!(懐)
0181デフォルトの名無しさんNGNG
gcc3.0でLOKIは動きますか?
0182デフォルトの名無しさんNGNG
>>181
動くらしい。(LokiのReadMeに書いてなかったけ?)
Lokiがコンパイルできる珍しい処理系
0183デフォルトの名無しさんNGNG
VCじゃできないのか??
0184デフォルトの名無しさんNGNG
BCCでもだめなのにVCで動くかー
0185デフォルトの名無しさんNGNG
>>183
じゃ、駄目じゃん、、、
いったいなんでgccでは動くのか、その理由が知りたいな。
実際、ここまで互換性がないとテンプレート怖くて使えないんだけど。
0186デフォルトの名無しさんNGNG
>>185
あるSTLの本の第一章に。

「互換性が低いことを怖がってSTLに対して保守的にならないで下さい。
時代はstanderd C++に向かっているのです。」
0187デフォルトの名無しさんNGNG
>>186
・・・で?
0188デフォルトの名無しさんNGNG
>>185
VC++ だと部分特殊化もメンバ関数テンプレートもサポートしてないから…
つーかもう4年近く前のコンパイラだよ?<VC6

VC.NETだとどの程度templateに対応してるんだろ。
0189デフォルトの名無しさんNGNG
VC.NETでLokiコンパイルしてみたひといる?
0190デフォルトの名無しさんNGNG
一応MSDN MagazineにはBoostやLokiがちゃんとコンパイルできる、
って書いてあったが<VC.NET
0191デフォルトの名無しさんNGNG
>>185
gccが開発バージョン2.9から最新ANSI C++規格を実装したからさ
それと.NETでLokiは使いたくないなー。VC.NETはやめとけ。
氏ぬぞ。
0192デフォルトの名無しさん NGNG
gccマンセー
0193デフォルトの名無しさんNGNG
Lokiってどこにあるの??
サイトがでかすぎて分からないヨ
0194デフォルトの名無しさんNGNG
http://www.awl.com/cseng/titles/0-201-70431-5/loki.zip
0195デフォルトの名無しさんNGNG
サンクス〜〜♪
0196デフォルトの名無しさんNGNG
Loki初めてみた。
凄ぇ・・・まさに天才。
0197デフォルトの名無しさんNGNG
みんなあれを最後まで理解した?
おれは3章であっぷあっぷだよ。
あんまりテンプレート自体を使いこなして内省かも。
0198デフォルトの名無しさんNGNG
色々とお褒めの言葉をならべてもLokiを使ったサンプルコードが
出てこないところをみると皆自分の中で消化吸収してる最中なのかな?

おれはあと3ヶ月ぐらいはかかるだろうな。
0199デフォルトの名無しさんNGNG
あげ!
0200デフォルトの名無しさんNGNG
Lokiすごいけどさ、やっぱりすごいだけで泥臭いと思うよ。
0201デフォルトの名無しさんNGNG
つーかおれはそもそもテンプレートの構文が嫌いだ。
0202デフォルトの名無しさんNGNG
こらこらtemplateあってのC++だ。
0203デフォルトの名無しさんNGNG
漏れもそうだ。
C++使う理由の大半はテンプレートがあることだからね。
STL なーんて素晴らしい。
0204デフォルトの名無しさんNGNG
じゃ、templateのないC++はなんなんだyo!
0205デフォルトの名無しさんNGNG
非互換C
0206デフォルトの名無しさんNGNG
>>204
Java
0207デフォルトの名無しさんNGNG
あんな糞言語と一緒にするなよ
0208デフォルトの名無しさんNGNG
やばい。ちんこ勃ってきた。
0209デフォルトの名無しさんNGNG
>>204
D言語
0210デフォルトの名無しさんNGNG
C#にはテンプレートに該当する物はあるのか?
0211デフォルトの名無しさんNGNG
つーかeval相当はないの?
0212デフォルトの名無しさんNGNG
>>211
evalはやめてー
究極すぎる
0213デフォルトの名無しさんNGNG
Ruby以外の言語は使い物になりません。以上。
0214デフォルトの名無しさんNGNG
>>213 激しく同意
0215デフォルトの名無しさんNGNG
えっへん!
0216デフォルトの名無しさんNGNG
あの本の一章に書いてあるポリシーパターンだけでも
結構使えるよな。テンプレートパラメータからホストクラスを
派生させるってのカッコいいから使ってるよ。
0217デフォルトの名無しさんNGNG
Int2TypeとかType2Typeもね
0218デフォルトの名無しさんNGNG
VS.NETを購入された方へ質問があるのですが、C#にはC++でいうところの
STLに該当する機能はあるのでしょうか。購入検討の資料としたいのです。
0219デフォルトの名無しさんNGNG
>>218
よく知らないけど、System.Collectionsのコンテナを
使うんじゃないかな?だからSTLは無いと思うけど。
0220デフォルトの名無しさんNGNG
タイプリストはなんか凄そうなんだけどあれをどう活用するのか
分からない。だれか簡単に説明してくれないかな?
0221デフォルトの名無しさんNGNG
なんでもλ
ttp://www.shiro.dreamhost.com/scheme/docs/lambda-j.html

STLといい最近のC++は関数型プログラミングの匂いがー
関数プログラミングのすばらしさはまだまだあるぜーいえー。
なんでも再帰
ttp://www.shiro.dreamhost.com/scheme/docs/tailcall-j.html
なぜ関数プログラミングは重要か
ttp://www.sampou.org/haskell/article/whyfp.html
0222デフォルトの名無しさんNGNG
>>220
Functorと組み合わせて高階関数ができるからかな?
ttp://www-6.ibm.com/jp/developerworks/linux/010921/j_l-prog3.html
ttp://www.teu.ac.jp/kougi/koshida/Prog6/Text08/index.html
ttp://a414s1.it.nanzan-u.ac.jp/smlbook/smlwww/node10.html

TypeListと補助するtemplateだけでも役にたつところもあるかな?
ttp://www.google.com/search?q=cache:5o9J68CC7oMC:www.tama.or.jp/~o-mikita/phantasien/memo/p0108.html+C%2B%2B+TypeList&hl=ja&lr=lang_ja
0223デフォルトの名無しさんkNGNG
今タイプリストの使い方を色々と本読みながら考えてるんですが、

class Cls
{
public:
 //このクラスにおいて関係するタイプのリストを作成する
 //(全てのアプリケーションコードにあるクラス内において必須)
 typedef TYPELIST_3(Cls1, Cls2, Cls3) MyClsList;
 ・・・
private:
 //必要なインスタンスを作成する
 Loki::TL::TypeAt<MYClsList, 0> cls1;
 Loki::TL::TypeAt<MYClsList, 2> cls3;
};

とかって感じにタイプリストからの型選択テンプレートクラスに
リストを渡して選ばせる感じに使うんでしょうか?
なんか頭が固くていい使い方が思い浮かばないなw
クラス間の関係が明確になるメリットは大きいかな。
0224デフォルトの名無しさんNGNG
アプリケーションコードにおいてもテンプレートパラメータの
諸関係だけを記述するようなプログラムを作るのってかなり頭痛いよね。
上の奴もCls自体をいくつかのテンプレートパラメータ(タイプリスト)を
もらうように直したら、かなり自由度は上がるけどもう何がなんだか
分からんものになりそうな・・・
アプリケーションプログラマにそこまで要求するんか!の世界。
この本読んで任意の処理に対するタイプリストの設計を勉強しないと
全然ダメだな。

こういうのはもっと若いうちにやりたかったよ。。。(遠い目

Lispハカーは、こういったやり方でいつもプログラミングしてるんですか?
0225デフォルトの名無しさんNGNG
>>223
その設計は良くないのでは?
(タイプリストの引数の数が変わったとき作りなおさなやね)
今手元に本が無いので上手く掛けないけど・・・
TypeListのクラスを単一継承するという活用法が載ってた
と思うけど、そってで攻めてみては?

あっ。Cls2,Cls3,Cls4見たいにしたらいいんか
0226223=224NGNG
>>225
今まではOO的なプログラミングということでインターフェイスを
規定してそれに対して実装するってやり方だったけど、これは
全然違うね。

最初にタイプリストありき。それの関係を記述するようなプログラミング。
あたま痛くなってくる。でもこれがホントの再利用性なのかも。
0227223=224NGNG
ダメだ、、、
馬ファ輪飲んで今日はもう寝る
0228225NGNG
>>223=224
個人的にはType2Typeぐらいしか使いたくないなー
実際の開発に使えそうなものって何かな?
0229デフォルトの名無しさんNGNG
結論
天才が書いたコードは天才しか再利用できない
0230223=224NGNG
>>228
んー、自分でも色々と考えてるんだけど、これをつかった効果を
なんとなく想像するので精一杯。

イメージとしては、既存の開発において
ライブラリコード:アプリケーションコード=1:10
ぐらいの比率だったとして、Alexandrescu方式のプログラミングを
導入したことで
ライブラリコード:アプリケーションコード=8:2
みたいなところまで比率に上げる。というか外部のライブラリやシステムに
依存したものを極力排除する。そうして全体のステップ数を減らす。
こんな世界(w)を期待してるのは分かるんだけど、
いかにライブラリコードを設計するかは一筋には逝かないね。

システムの全体を理解してパターンを適用し、それらの関係を
リストで表現する。こんな天才的能力がある人だけが使うものかもね。
リストをデータ構造としか考えてこなかった俺みたいなヘタレには
そもそも無関係かも(w

STLで上がった生産性がアプリケーション全体に適応されたら
天才とヘタレの能率の差なんて目も当てられないだろな。
0231223=224NGNG
>>229
天才の書いたコードは天才しか再利用できないかもしれないけど、
ModernC++Designで言われているのは「自分の書いたコードぐらい
再利用しようぜ」ってことだと思う。

天才がこういったプログラム設計をあっという間に理解して
抽象度の高いプログラミングをしてると思うとカナーリ鬱なんだけど、
ヘタレもお遊び程度にはやっておかないと。

今日はショックで眠れないYO、トホホ
0232デフォルトの名無しさんNGNG
Haskellマンセー!!!
0233デフォルトの名無しさんNGNG
>>223=224
クラス同士の機能が独立したものになるように
設計すればいいかも。
そのクラス同士を組み合わせるところにGenerativ Programming
を使えばよいと考えている。

しかし完全に機能が独立したクラスまで上手く機能を分割できないと・・・・
俺にはむりっす
0234デフォルトの名無しさんNGNG
おみゃーら、Haskellやれ。
C++のきったねー構文に関する知識は後から詰め込めばよし。
まずはプログラミングが何なのかを学ぶためにHaskellをやれ。
0235デフォルトの名無しさんNGNG
>>234
スレ違い。
0236デフォルトの名無しさんNGNG
>>234
板違い

http://cheese.2ch.net/test/read.cgi/math/1015420115/
あっちの板では認知度が低いです。がんばって宣伝してきてね
0237デフォルトの名無しさんNGNG
>>234
HaskellはIOとのやり取りが弱いので実用的ではない。
まあ、これは言語ではなく処理系の問題だが。

あとHaskellはマクロが無いね。
コンパイル時でないと知りえない情報(__FILE__とか__LINE__)が
かけない。すこし残念。
0238デフォルトの名無しさんNGNG
ああいったプログラミングテクニックってどこに書いてあるの?
C++Report?DDJ?
0239デフォルトの名無しさんNGNG
単にLoki::SingletonHolderを使ってみるだけでも苦労した。鬱だ…
0240デフォルトの名無しさんNGNG
Loliは凄いけどタイプリストのマクロ定義にがっかりした人も多いはず!
もっと柔軟なものをここでなんとしてでも作りませう!
0241デフォルトの名無しさんkNGNG
無理
0242デフォルトの名無しさんNGNG
俺には無理
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をコンパイルするの忘れてた。失礼!
■ このスレッドは過去ログ倉庫に格納されています