[表示 : 全て 最新50 1-99 101- 2chのread.cgiへ]
Update time : 05/09 14:21 / Filesize : 39 KB / Number-of Response : 165
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++/TemplateMetaProgramming



1 名前:デフォルトの名無しさん [2008/02/16(土) 12:45:02 ]
・ここはC++のテンプレートメタプログラミング専用スレです。
・なかったので立てました。
・前にもあったような気がするけど気にしない。
・次期C++(0x) boost STLの話題も、TMPに関係するならここにどうぞ。

仲良く使ってね。

2 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:48:44 ]
とりあえずTMP始めてだから優しくしてね><って人には
p_stabeのとこのブログのログを最初から読んだりしてみる事から始めるといい。

3 名前:デフォルトの名無しさん [2008/02/16(土) 12:49:15 ]
すいません、やっぱり、該当スレでお願いします。
申し訳ありませんでした。

4 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:49:55 ]
おい>>1、メタだけあってもしょうがないだろ
何を話題にすりゃいいんだ

5 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:50:02 ]
>>1

6 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:50:48 ]
>>4
いくらでも話題はあるさね

7 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:51:13 ]
>>4
template<fugafuga>を使った機能とか、
必要であればプリプロセッサも絡めてもらうとありがたいです。

8 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:53:14 ]
>>7
だったらテンプレートスレにしておけば良かったのでは・・・
なぜメタ限定?

9 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:55:49 ]
>>8
テンプレートスレならNTPとかMOJOばっかりで
Lispみたいなメタプログラミングは話題にし辛いだろう。
ここはそういうのを扱うスレ。コンパイル時点での、コードに対するプログラミングに関するスレ。


10 名前:デフォルトの名無しさん [2008/02/16(土) 12:59:04 ]
>>8
激しく同意だな
でも、テンプレートスレじゃboost、STL、C++スレでカバーで良いんじゃね



11 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:01:05 ]
とりあえずPreprocessor Metaprogramming万歳

12 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:02:02 ]
メタプロと普通のテンプレート使ったプログラムは全然違うだろう。

13 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:02:20 ]
STLスレやboostスレとか何度も統廃合の話題が出てその度に荒れていたな


14 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:02:53 ]
スレが立った初っ端からいろいろ文句つけてる奴は何だ?
現在、板の各所に散らばっている“テンプレートスレ”で満足しているならこんな所覗く必要はないだろう。
“メタプログラミング”を話題にしたい奴がここを必要としているんだ。興味がないなら来るな。

15 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:03:31 ]
そうだそうだ

16 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:04:05 ]
いや、興味あるとかないとかそういう問題じゃねぇーだろw

17 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:04:26 ]
別にMetaProgrammingであればTemplateは必要なかったのでは?
誤解を招くだけだし。

あと、
>>1
>仲良く使ってね。

18 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:05:07 ]
メタプロが理解できない奴が嫉妬してクレーム付けてるだけだろ

19 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:06:21 ]
勢いが1234もある。
過疎ったVIPスレ並みに速い流れだな。その割には糞なレス多いけど。

20 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:07:05 ]
{
std::ofstream f( "tmp.cpp" ) ;
f << いろいろいろいろいろいろ ;
}
system( "cc tmp.cpp" );
system( "a.out" );
では、このあたりからw



21 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:08:30 ]
クラックしがいがありそうだなw

22 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:10:44 ]
>>20
テンプレート(ライブラリ)を使ったメタプログラミングだwww

23 名前:デフォルトの名無しさん [2008/02/16(土) 13:15:15 ]
だいたい、>>1がアホだからいけないんだ
Templateなんて入れるないで、素直にC++/メタプログラミングすればよかった

24 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:17:33 ]
>8
Boost, STLとの統合の話題が出てくるからじゃね?
あっちは使い方、こっちは実装テクニックと使い分けできるといいね。

そういやポリシーってみんなどんぐらい使ってる?
template<class T> class M : public T {};
struct T1 { void t1() {}; };
struct T2 { void t2() {}; };
M<T1>().t1();
M<T2>().t2();
とか、インターフェースの差し替えが出来てけっこう便利な気がするんだけど。


25 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:19:13 ]
単純にテンプレートテクニックスレで良かったんじゃね、とか

26 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:20:59 ]
とりあえず同名の本の解答集
www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?CPP_Template_Metaprogramming_Book_-_Answers_Page

例えば演習2-3で型を文字列で出力するテンプレートを作りなさいなんて問題あるけど、
std::cout << type_descriptor<long const*&>();
これ、C++だと volatile, const, ポインタ、参照でそれぞれ specialization で場合分け
し、さらに基本型の int, long, char, double とかでさらに場合分け
とかなって、なんだか力業だなぁとか感じる(答参照)。

27 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:22:12 ]
>>24
スーパークラスに直接Tをいれるのはコンパイルが異様に重くなるので最近は避けているな。

28 名前:24 mailto:sage [2008/02/16(土) 13:27:07 ]
>27
エエエ(ry
コンパイルなんて昔に比べると激早だから、あんまり気にしないなあ。
どちらかというと使う側でpimplとかの工夫してるし。


29 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:28:41 ]
そおか、C++以外の言語を使ったあとだと余りの遅さにかなりショックを受けるんだが。

30 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:34:03 ]
100ファイル程度あると、C++は自作オーバークロックの最強マシンをもってして三十分や一時間かかりかねないけれど
これがC#だとヘナチョコマシンでも一分掛かるか掛からないかといった所。



31 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:37:46 ]
コンパイル時間のほとんどは
プリプロセスなんだろうなあ。

32 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:48:27 ]
>>30
どう考えてもそれは長すぎる
せいぜいかかっても1ファイルに2〜3秒ってところじゃないの?

33 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:48:37 ]
Boost.Lambdaのヘッダをプリコンパイルドヘッダに入れようとすると、
pchがぶくぶく膨らんでいく。

後のコンパイルでは、プリコンパイルドヘッダの読込も
ボトルネックになっているのではという気がしてならない。

34 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:50:18 ]
>>31
よほど凝ったことしなきゃそれはないだろ

35 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:51:20 ]
プリコンパイルでどれだけの時間が短縮されるか考えたら
そんなもんだと思う

36 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:52:37 ]
プリコンパイルは一応コンパイルもしてるわけで

37 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:55:07 ]
>33
ヘッダを重くするとそうなるけど、それこそpimplで隠したら?

Boost.Lambdaをヘッダに突っ込もうとする時点で何か設計で失敗している気がするけど。
#ライブラリを設計しているのならしょうがないけど

38 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:59:49 ]
$ cat test.cpp
# include <boost/lambda/lambda.hpp>

int main()
{
using namespace boost::lambda;
int i = 4;
return (_1 + _1 + 1)(i);
}
$ time g++ test.cpp

real 0m1.175s
user 0m0.900s
sys 0m0.068s
$ time cpp test.cpp >/dev/null

real 0m0.249s
user 0m0.160s
sys 0m0.024s

39 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 14:03:25 ]
>>37
たしかにLambda自体は特定のcppファイルでしか使っていない。
こういうときはプリコンパイルドヘッダから外すべきなのか?

40 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 14:05:43 ]
そらそうだな。



41 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 14:09:20 ]
>39
ヘッダは基本的にインターフェイスなんだから、インターフェイスに不要な実装は隠すのが望ましい。
テンプレート使ってるとそんなことも言ってらんないけど。

42 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 14:16:12 ]
そろそろC++という言語自体を見直すのが望ましいという気もしないでもない
問題累積しすぎだろ

43 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 14:19:31 ]
>>41
stdafx.hで何もかもインクルードしていたよ。

44 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 14:32:12 ]
以前のスレを探してきた。

【C++】template 統合スレ -- Part6
pc8.2ch.net/test/read.cgi/tech/1101384692/

45 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 14:49:06 ]
ある程度確定したクラス他は専用libに放り込んでるので無問題

46 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 14:58:08 ]
・クラス単体のみの宣言だけ
 class A;
・クラスのインターフェイスを含めた宣言だけ
 class A{ void f(); };

2種類のヘッダを用意すれば(ry

47 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 16:28:15 ]
>41
C++狂Herb Sutterの本を読んだほうが良いと思う。
ヘッダファイル: インターフェイスに関係するファイルを最低限
ソースファイル: できるだけこっちでインクルードする
が基本だよ。

48 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 16:31:58 ]
コンパイル時間の節約は分かるんだが、
いざヘッダファイルをインクルードして何か使おうとすると
実装が無いとか文句言われることがあるのが困るんだよな。

49 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 16:32:21 ]
実装じゃねえや。定義だ。

50 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 16:33:06 ]
>>48
ただの誤用にしか聞こえんのだが、どういう状況の話?



51 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 16:39:01 ]
不完全型のみで十分な状況では
その型を定義してあるヘッダをインクルードせず、
不完全型の宣言のみを書く。
そして、その型を使ってるソースファイルでのみ、
そのヘッダファイルをインクルードする。

52 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 16:59:36 ]
なんかC++の基本もまともに出来ないような人が居ますね。

53 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 02:18:38 ]
TMPやるにはHaskell勉強した方が良いって本当ですか?

54 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 02:20:47 ]
>>53
変数への代入ができないという制約の下でどうやって問題を解決するかを学ぶ、
という点で本当だと思う。

55 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 10:28:54 ]
SICP読んだらModern C++ Designが分かった

56 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:01:03 ]
Scheme勉強したらModern C++ Designが分かった

57 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:47:54 ]
あれって別の関数型言語を勉強してからじゃないと理解できないほど難しいか?

58 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:59:44 ]
ムチャクチャな書き方をしないといけないからわかりにくいんだよ。
すっきりした表記の関数型言語を勉強した後だと
どういうトリックなのかがすんなり理解できる。

59 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 14:01:52 ]
別に無茶苦茶ではないと思うが。

60 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 14:54:27 ]
再帰に継承が絡んでくると難しく感じる。




61 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 14:56:58 ]
慣れてないだけだな。それにあんなもの別にC++以外のものを触ったって慣れやしない。

62 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 15:32:39 ]
ところで>>2のp_stabeには誰もつっこまないの?
p_stadeじゃないかって

63 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 15:37:29 ]
q_stabe

64 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 16:57:57 ]
>>61
それは違うと思う。関数型言語のほうが記法が簡便だが抽象度が高く
センスが必要。LispでもSchemeでも自在に扱えればC++のメタなんて少し
の時間でマスターできる。templateなんて少しの時間でマスターできる。
経験上確信してる。逆は成立しない。

65 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 17:19:20 ]
千差万別、十人十色
自論に固執すること愚か也

66 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 17:32:39 ]
言語に組み込まれてるってのは重要だよな。

C++だとマクロとかでちょっと文法の解釈を脳内変換すれば
いいんだけど手間が増大するのと
初学者に扱える代物ではなくなってしまうんだよね。


67 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 18:10:14 ]
>>65
関数型言語の経験ないだろ?

68 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 18:10:49 ]
>>65
SICPは読んだ?

69 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 18:25:10 ]
負けへん、負けへん
山ちゃんは負けへんでええ

70 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 18:25:39 ]
誰か質問しろよ。
スレ落ちるの時間の問題だな。



71 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 18:30:41 ]
C++0xではmplは入らなくてTypeTraitsどまりってことは
mplはまだ重視されてないってこと?メイヤーズの本では
TMPがC++の中心に来ることはないなんて書いてあったけど
どうなんだろ?

72 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 19:20:00 ]
そうなんでしょう。
だって頭の体操にはなるけど、あんまり実用性ないじゃん。

73 名前:デフォルトの名無しさん [2008/02/18(月) 19:27:11 ]
type_traitsはフレームワークであって、
みんなが自分のクラスのtraitsを提供しないと真価を発揮しないけど、
mplは使いたい人が使えばいいだけだから標準化しなくても困らない。

74 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 19:38:50 ]
C++0x において提案されている <type_traits> で提供される機能の中には
コンパイラが持っている独自の情報を吐いてくれないと実装できないものも多いので
そういう意味で TypeTraits は優先的に規格として明示してくれないと困るかと

75 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 19:40:35 ]
call_traits は追加されるの?

76 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 20:41:26 ]
MP専用の構文を入れる気はもうないのかね

Templateでできたのはたまたまであって、
いつまでもあんなハックみたいな書き方したくないなぁ

77 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 23:08:07 ]
バッドノウハウ

78 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 02:44:27 ]
完全体のC++かどうかを判断するために
compiler_traits
が必要な気がする。



79 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 02:49:56 ]
そうなるとまず has_compiler_traits が必要だな。

80 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 21:01:07 ]
>>76
D言語の出番ですね、分かります



81 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 23:57:02 ]
いやあ、すべってるねえ このスレ

82 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:07:56 ]
昔ProgramingJemsにメタプログラミングでsinテーブルを生成するっていうネタがあった

当時メタプログラミングなんて知らなくて、
「すげぇぇぇぇ」と感動して自分でも作ってみた

しかし当時のオレのショボマシンではコンパイル時のサインテーブルの生成に結構な時間がかかり
最終的に、
Perlでテーブル書いたソースジェネレートした方が早くね?
という結論に

83 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:13:14 ]
メタプログラミングとは?

テンプレート、型、typedef、コンパイル時定数、再帰を
駆使したコンパイル時プログラミングで合ってる?

84 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:15:48 ]
テンプレートメタプログラミングならそれでまあ合ってる。

85 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:18:10 ]
>>83
それはテンプレートメタプログラミングの説明だな
メタプログラミング自体はもっと広く、プログラムを操作するプログラム全般をいう
プリプロセッサを使うのもメタプログラミングだし、コードジェネレータを書くのも含む

86 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:20:22 ]
テンプレート抜けてた。

87 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:43:39 ]
そういう意味では82のPerlでソース生成と言うのも立派なメタプログラミング。

88 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 01:04:07 ]
>>82
そんなあなたに constexpr@C++0x

89 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 01:06:00 ]
一方D言語はsinを定数として畳み込んだ。

90 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 01:09:59 ]
静的に実行できる関数は静的に実行してしまう。
D は中々のものだ。



91 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 01:35:24 ]
D言語って誰が生みの親なの?


92 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 01:36:25 ]
昔borlandで働いてた人

93 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 01:37:28 ]
をるたん

94 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 01:40:52 ]
>>92
じゃあ流行らないな

95 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 01:43:40 ]
ボーランドはちがくね?

96 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 18:26:21 ]
>>82
まあC++のテンプレートはメタプログラミングのために設計されてないからねえ。
マクロらしいマクロを持った言語なら、かなり高度なメタプログラミングをやってても
普通のコードの2倍やそこらの時間でコンパイルできる。
Lispの世界じゃ40年前からメタプログラミングが当たり前だし、
DOSの世界ではMASMのマクロで構造化なんてのが流行った。

97 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 18:35:23 ]
ライブラリ作るときは主流になりそうだけどな。
てか、もうなってるか。
でもschemeのほうが言語機能としてcons listとか
があるから、より簡潔でストレス感じない。
C++のTMPはいかんせん表現がキモ過ぎる。

98 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 21:15:57 ]
そこで constexpr ですよ

99 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 02:22:19 ]
こんなの作ってみた。
自分のプログラムでは活用できてるからいいんだけど、意外と汎用性ないな……

struct UniqueNumber {
   template<class type_t>
   static unsigned int number() { static unsigned int n(count()); return n; };
private:
   static unsigned int count() { static unsigned int c(0); return c++; };
}

100 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 01:51:48 ]
>>83
プログラムを作るプログラムをプログラムしてみようって事だよ
当然、(プログラムをつくるプログラム)をつくるプログラムもね。
どこまででも逝ってくれ



101 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 16:49:57 ]
>>99
typeidの速度が気になる場面で使うのかな?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<39KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef