2ちゃんねる★スマホ版★■掲示板に戻る■全部1-最新50

C++/TemplateMetaProgramming

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

仲良く使ってね。
2 :
2008/02/16(土) 12:48:44
とりあえずTMP始めてだから優しくしてね><って人には
p_stabeのとこのブログのログを最初から読んだりしてみる事から始めるといい。
3 :
デフォルトの名無しさん
2008/02/16(土) 12:49:15
すいません、やっぱり、該当スレでお願いします。
申し訳ありませんでした。
4 :
2008/02/16(土) 12:49:55
おい>>1、メタだけあってもしょうがないだろ
何を話題にすりゃいいんだ
5 :
2008/02/16(土) 12:50:02
>>1
6 :
2008/02/16(土) 12:50:48
>>4
いくらでも話題はあるさね
7 :
2008/02/16(土) 12:51:13
>>4
template<fugafuga>を使った機能とか、
必要であればプリプロセッサも絡めてもらうとありがたいです。
8 :
2008/02/16(土) 12:53:14
>>7
だったらテンプレートスレにしておけば良かったのでは・・・
なぜメタ限定?
9 :
2008/02/16(土) 12:55:49
>>8
テンプレートスレならNTPとかMOJOばっかりで
Lispみたいなメタプログラミングは話題にし辛いだろう。
ここはそういうのを扱うスレ。コンパイル時点での、コードに対するプログラミングに関するスレ。
10 :
デフォルトの名無しさん
2008/02/16(土) 12:59:04
>>8
激しく同意だな
でも、テンプレートスレじゃboost、STL、C++スレでカバーで良いんじゃね
11 :
2008/02/16(土) 13:01:05
とりあえずPreprocessor Metaprogramming万歳
12 :
2008/02/16(土) 13:02:02
メタプロと普通のテンプレート使ったプログラムは全然違うだろう。
13 :
2008/02/16(土) 13:02:20
STLスレやboostスレとか何度も統廃合の話題が出てその度に荒れていたな
14 :
2008/02/16(土) 13:02:53
スレが立った初っ端からいろいろ文句つけてる奴は何だ?
現在、板の各所に散らばっている“テンプレートスレ”で満足しているならこんな所覗く必要はないだろう。
“メタプログラミング”を話題にしたい奴がここを必要としているんだ。興味がないなら来るな。
15 :
2008/02/16(土) 13:03:31
そうだそうだ
16 :
2008/02/16(土) 13:04:05
いや、興味あるとかないとかそういう問題じゃねぇーだろw
17 :
2008/02/16(土) 13:04:26
別にMetaProgrammingであればTemplateは必要なかったのでは?
誤解を招くだけだし。

あと、
>>1
>仲良く使ってね。
18 :
2008/02/16(土) 13:05:07
メタプロが理解できない奴が嫉妬してクレーム付けてるだけだろ
19 :
2008/02/16(土) 13:06:21
勢いが1234もある。
過疎ったVIPスレ並みに速い流れだな。その割には糞なレス多いけど。
20 :
2008/02/16(土) 13:07:05
{
std::ofstream f( "tmp.cpp" ) ;
f << いろいろいろいろいろいろ ;
}
system( "cc tmp.cpp" );
system( "a.out" );
では、このあたりからw
21 :
2008/02/16(土) 13:08:30
クラックしがいがありそうだなw
22 :
2008/02/16(土) 13:10:44
>>20
テンプレート(ライブラリ)を使ったメタプログラミングだwww
23 :
デフォルトの名無しさん
2008/02/16(土) 13:15:15
だいたい、>>1がアホだからいけないんだ
Templateなんて入れるないで、素直にC++/メタプログラミングすればよかった
24 :
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 :
2008/02/16(土) 13:19:13
単純にテンプレートテクニックスレで良かったんじゃね、とか
26 :
2008/02/16(土) 13:20:59
とりあえず同名の本の解答集
http://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 :
2008/02/16(土) 13:22:12
>>24
スーパークラスに直接Tをいれるのはコンパイルが異様に重くなるので最近は避けているな。
28 :
2008/02/16(土) 13:27:07
>27
エエエ(ry
コンパイルなんて昔に比べると激早だから、あんまり気にしないなあ。
どちらかというと使う側でpimplとかの工夫してるし。
29 :
2008/02/16(土) 13:28:41
そおか、C++以外の言語を使ったあとだと余りの遅さにかなりショックを受けるんだが。
30 :
2008/02/16(土) 13:34:03
100ファイル程度あると、C++は自作オーバークロックの最強マシンをもってして三十分や一時間かかりかねないけれど
これがC#だとヘナチョコマシンでも一分掛かるか掛からないかといった所。
31 :
2008/02/16(土) 13:37:46
コンパイル時間のほとんどは
プリプロセスなんだろうなあ。
32 :
2008/02/16(土) 13:48:27
>>30
どう考えてもそれは長すぎる
せいぜいかかっても1ファイルに2〜3秒ってところじゃないの?
33 :
2008/02/16(土) 13:48:37
Boost.Lambdaのヘッダをプリコンパイルドヘッダに入れようとすると、
pchがぶくぶく膨らんでいく。

後のコンパイルでは、プリコンパイルドヘッダの読込も
ボトルネックになっているのではという気がしてならない。
34 :
2008/02/16(土) 13:50:18
>>31
よほど凝ったことしなきゃそれはないだろ
35 :
2008/02/16(土) 13:51:20
プリコンパイルでどれだけの時間が短縮されるか考えたら
そんなもんだと思う
36 :
2008/02/16(土) 13:52:37
プリコンパイルは一応コンパイルもしてるわけで
37 :
2008/02/16(土) 13:55:07
>33
ヘッダを重くするとそうなるけど、それこそpimplで隠したら?

Boost.Lambdaをヘッダに突っ込もうとする時点で何か設計で失敗している気がするけど。
#ライブラリを設計しているのならしょうがないけど
38 :
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 :
2008/02/16(土) 14:03:25
>>37
たしかにLambda自体は特定のcppファイルでしか使っていない。
こういうときはプリコンパイルドヘッダから外すべきなのか?
40 :
2008/02/16(土) 14:05:43
そらそうだな。
41 :
2008/02/16(土) 14:09:20
>39
ヘッダは基本的にインターフェイスなんだから、インターフェイスに不要な実装は隠すのが望ましい。
テンプレート使ってるとそんなことも言ってらんないけど。
42 :
2008/02/16(土) 14:16:12
そろそろC++という言語自体を見直すのが望ましいという気もしないでもない
問題累積しすぎだろ
43 :
2008/02/16(土) 14:19:31
>>41
stdafx.hで何もかもインクルードしていたよ。
44 :
2008/02/16(土) 14:32:12
以前のスレを探してきた。

【C++】template 統合スレ -- Part6
http://pc8.2ch.net/test/read.cgi/tech/1101384692/
45 :
2008/02/16(土) 14:49:06
ある程度確定したクラス他は専用libに放り込んでるので無問題
46 :
2008/02/16(土) 14:58:08
・クラス単体のみの宣言だけ
 class A;
・クラスのインターフェイスを含めた宣言だけ
 class A{ void f(); };

2種類のヘッダを用意すれば(ry
47 :
2008/02/16(土) 16:28:15
>41
C++狂Herb Sutterの本を読んだほうが良いと思う。
ヘッダファイル: インターフェイスに関係するファイルを最低限
ソースファイル: できるだけこっちでインクルードする
が基本だよ。
48 :
2008/02/16(土) 16:31:58
コンパイル時間の節約は分かるんだが、
いざヘッダファイルをインクルードして何か使おうとすると
実装が無いとか文句言われることがあるのが困るんだよな。
49 :
2008/02/16(土) 16:32:21
実装じゃねえや。定義だ。
50 :
2008/02/16(土) 16:33:06
>>48
ただの誤用にしか聞こえんのだが、どういう状況の話?
51 :
2008/02/16(土) 16:39:01
不完全型のみで十分な状況では
その型を定義してあるヘッダをインクルードせず、
不完全型の宣言のみを書く。
そして、その型を使ってるソースファイルでのみ、
そのヘッダファイルをインクルードする。
52 :
2008/02/16(土) 16:59:36
なんかC++の基本もまともに出来ないような人が居ますね。
53 :
2008/02/17(日) 02:18:38
TMPやるにはHaskell勉強した方が良いって本当ですか?
54 :
2008/02/17(日) 02:20:47
>>53
変数への代入ができないという制約の下でどうやって問題を解決するかを学ぶ、
という点で本当だと思う。
55 :
2008/02/17(日) 10:28:54
SICP読んだらModern C++ Designが分かった
56 :
2008/02/18(月) 13:01:03
Scheme勉強したらModern C++ Designが分かった
57 :
2008/02/18(月) 13:47:54
あれって別の関数型言語を勉強してからじゃないと理解できないほど難しいか?
58 :
2008/02/18(月) 13:59:44
ムチャクチャな書き方をしないといけないからわかりにくいんだよ。
すっきりした表記の関数型言語を勉強した後だと
どういうトリックなのかがすんなり理解できる。
59 :
2008/02/18(月) 14:01:52
別に無茶苦茶ではないと思うが。
60 :
2008/02/18(月) 14:54:27
再帰に継承が絡んでくると難しく感じる。
61 :
2008/02/18(月) 14:56:58
慣れてないだけだな。それにあんなもの別にC++以外のものを触ったって慣れやしない。
62 :
2008/02/18(月) 15:32:39
ところで>>2のp_stabeには誰もつっこまないの?
p_stadeじゃないかって
63 :
2008/02/18(月) 15:37:29
q_stabe
64 :
2008/02/18(月) 16:57:57
>>61
それは違うと思う。関数型言語のほうが記法が簡便だが抽象度が高く
センスが必要。LispでもSchemeでも自在に扱えればC++のメタなんて少し
の時間でマスターできる。templateなんて少しの時間でマスターできる。
経験上確信してる。逆は成立しない。
65 :
2008/02/18(月) 17:19:20
千差万別、十人十色
自論に固執すること愚か也
66 :
2008/02/18(月) 17:32:39
言語に組み込まれてるってのは重要だよな。

C++だとマクロとかでちょっと文法の解釈を脳内変換すれば
いいんだけど手間が増大するのと
初学者に扱える代物ではなくなってしまうんだよね。
67 :
2008/02/18(月) 18:10:14
>>65
関数型言語の経験ないだろ?
68 :
2008/02/18(月) 18:10:49
>>65
SICPは読んだ?
69 :
2008/02/18(月) 18:25:10
負けへん、負けへん
山ちゃんは負けへんでええ
70 :
2008/02/18(月) 18:25:39
誰か質問しろよ。
スレ落ちるの時間の問題だな。
71 :
2008/02/18(月) 18:30:41
C++0xではmplは入らなくてTypeTraitsどまりってことは
mplはまだ重視されてないってこと?メイヤーズの本では
TMPがC++の中心に来ることはないなんて書いてあったけど
どうなんだろ?
72 :
2008/02/18(月) 19:20:00
そうなんでしょう。
だって頭の体操にはなるけど、あんまり実用性ないじゃん。
73 :
デフォルトの名無しさん
2008/02/18(月) 19:27:11
type_traitsはフレームワークであって、
みんなが自分のクラスのtraitsを提供しないと真価を発揮しないけど、
mplは使いたい人が使えばいいだけだから標準化しなくても困らない。
74 :
2008/02/18(月) 19:38:50
C++0x において提案されている <type_traits> で提供される機能の中には
コンパイラが持っている独自の情報を吐いてくれないと実装できないものも多いので
そういう意味で TypeTraits は優先的に規格として明示してくれないと困るかと
75 :
2008/02/18(月) 19:40:35
call_traits は追加されるの?
76 :
2008/02/18(月) 20:41:26
MP専用の構文を入れる気はもうないのかね

Templateでできたのはたまたまであって、
いつまでもあんなハックみたいな書き方したくないなぁ
77 :
2008/02/18(月) 23:08:07
バッドノウハウ
78 :
2008/02/19(火) 02:44:27
完全体のC++かどうかを判断するために
compiler_traits
が必要な気がする。

79 :
2008/02/19(火) 02:49:56
そうなるとまず has_compiler_traits が必要だな。
80 :
2008/02/19(火) 21:01:07
>>76
D言語の出番ですね、分かります
81 :
2008/02/19(火) 23:57:02
いやあ、すべってるねえ このスレ
82 :
2008/02/20(水) 00:07:56
昔ProgramingJemsにメタプログラミングでsinテーブルを生成するっていうネタがあった

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

しかし当時のオレのショボマシンではコンパイル時のサインテーブルの生成に結構な時間がかかり
最終的に、
Perlでテーブル書いたソースジェネレートした方が早くね?
という結論に
83 :
2008/02/20(水) 00:13:14
メタプログラミングとは?

テンプレート、型、typedef、コンパイル時定数、再帰を
駆使したコンパイル時プログラミングで合ってる?
84 :
2008/02/20(水) 00:15:48
テンプレートメタプログラミングならそれでまあ合ってる。
85 :
2008/02/20(水) 00:18:10
>>83
それはテンプレートメタプログラミングの説明だな
メタプログラミング自体はもっと広く、プログラムを操作するプログラム全般をいう
プリプロセッサを使うのもメタプログラミングだし、コードジェネレータを書くのも含む
86 :
2008/02/20(水) 00:20:22
テンプレート抜けてた。
87 :
2008/02/20(水) 00:43:39
そういう意味では82のPerlでソース生成と言うのも立派なメタプログラミング。
88 :
2008/02/20(水) 01:04:07
>>82
そんなあなたに constexpr@C++0x
89 :
2008/02/20(水) 01:06:00
一方D言語はsinを定数として畳み込んだ。
90 :
2008/02/20(水) 01:09:59
静的に実行できる関数は静的に実行してしまう。
D は中々のものだ。
91 :
2008/02/20(水) 01:35:24
D言語って誰が生みの親なの?
92 :
2008/02/20(水) 01:36:25
昔borlandで働いてた人
93 :
2008/02/20(水) 01:37:28
をるたん
94 :
2008/02/20(水) 01:40:52
>>92
じゃあ流行らないな
95 :
2008/02/20(水) 01:43:40
ボーランドはちがくね?
96 :
2008/02/20(水) 18:26:21
>>82
まあC++のテンプレートはメタプログラミングのために設計されてないからねえ。
マクロらしいマクロを持った言語なら、かなり高度なメタプログラミングをやってても
普通のコードの2倍やそこらの時間でコンパイルできる。
Lispの世界じゃ40年前からメタプログラミングが当たり前だし、
DOSの世界ではMASMのマクロで構造化なんてのが流行った。
97 :
2008/02/20(水) 18:35:23
ライブラリ作るときは主流になりそうだけどな。
てか、もうなってるか。
でもschemeのほうが言語機能としてcons listとか
があるから、より簡潔でストレス感じない。
C++のTMPはいかんせん表現がキモ過ぎる。
98 :
2008/02/20(水) 21:15:57
そこで constexpr ですよ
99 :
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 :
2008/02/23(土) 01:51:48
>>83
プログラムを作るプログラムをプログラムしてみようって事だよ
当然、(プログラムをつくるプログラム)をつくるプログラムもね。
どこまででも逝ってくれ
101 :
2008/02/25(月) 16:49:57
>>99
typeidの速度が気になる場面で使うのかな?
102 :
2008/02/25(月) 17:07:03
>>99
struct UniqueNumber {
static unsigned int number() { return count(); }
private:
static unsigned int count() { static unsigned int c; return c++; }
}

これでよくない?
103 :
2008/02/25(月) 17:09:25
>>102
全然よくない。
104 :
2008/02/25(月) 17:13:44
>>103
何で?
type_tテンプレートパラメータ使われてないよ。
105 :
2008/02/25(月) 17:16:00
>>104
UniqueNumber::number<A>()とかUniqueNumber::number<B>()みたいな使い方するんでしょ。
で、テンプレートに渡した型毎に一定のユニークな値が返ってくると。
106 :
2008/02/25(月) 17:33:05
ああそうか

でも
cout << UniqueNumber::number<int>() << endl;
cout << UniqueNumber::number<int>() << endl;
cout << UniqueNumber::number<int>() << endl;
cout << UniqueNumber::number<char>() << endl;
cout << UniqueNumber::number<char>() << endl;
cout << UniqueNumber::number<float>() << endl;

やったら
0 0 0 1 1 2
となった。
何で、0 1 2 0 1 0にならないのかな?
107 :
2008/02/25(月) 17:38:05
わかりますた。なるほど。
108 :
2008/03/01(土) 03:50:23
応用例作ってみた。
ttp://fiercewinds.net/siki/pub/2008/03/01_032951/
継承で登録を強制できれば便利そうなんだけどなぁ。
あとファクトリ関数みたいに関数の引数とか戻り値にそのクラスを含む場合は、こんな大掛りな仕掛けは不要みたい。

……それ以前に言語側で何とかして欲しいよな。こんなの。
109 :
2008/03/15(土) 21:46:47
ちょっと質問です。
外部リンケージについて詳しく書いてある解説ってある?
具体的には関数内クラスをテンプレートパラメーターにして渡したいんだけどね。
externでも上手く行かんし……
110 :
2008/03/15(土) 21:51:35
それはそもそも無理じゃまいか?
111 :
2008/03/15(土) 22:19:26
>>109
規格上不可能
112 :
デフォルトの名無しさん
2008/04/10(木) 23:41:05
メタプログラミングしてると脳汁でます
113 :
2008/04/11(金) 00:39:33
なぜjavaやC#でtemplateが外されたか
不要物だからw
114 :
2008/04/11(金) 00:58:20
なぜJavaやC#でgeneri(ry
115 :
2008/04/11(金) 01:01:28
失ってから大切さに気付くものです
116 :
デフォルトの名無しさん
2008/05/07(水) 22:32:52
boost::mplとか使ってるコードで見る、
_1, _2ってどうやって実現してるんですか?
117 :
2008/05/07(水) 22:35:39
ソース読めばいいだろw
118 :
2008/05/07(水) 23:07:19
defineかtypedefだったかな
119 :
2008/05/09(金) 15:11:22
テンプレートで配列指定された場合エラーにする方法ってあるんでしょうか?
120 :
2008/05/09(金) 18:55:50
type_traitsのis_arrayとBOOST_STATIC_ASSERTを組み合せればいけるはず
121 :
2008/05/14(水) 07:27:15
g++とVC2008どっちがテンプレート学ぶにはいいですか?
どっちがより完璧にテンプレートをコンパイルできますか?
122 :
2008/05/14(水) 07:35:58
どうみてもg++
123 :
2008/05/14(水) 09:16:34
>>122
ありがとう。
124 :
2008/05/19(月) 02:14:25
テンプレートの実体化でテンプレート引数を特殊化にマッチさせる過程って
Prologの統一化と似てる気がする
125 :
2008/06/01(日) 02:40:06
>>99
のような型にユニークな数字を割り当てるのをコンパイル時にできないでしょうか?
boost::fusion::vectorに格納されている型をすべてユニークな型にしたいとき、
単純に片っ端から同じ型が含まれていないか調べると計算量がO(n*n)(nは格納されている型の数)になるかと思います。

そこで、boost::fusion::vectorをboost::mpl::sortしてboost::mpl::uniqueすれば
sortが平均O(n*log(n)), uniqueがO(n)だとすると先に説明した単純な方法より高速に計算する事ができるかと思います。

ですが一般的な型に対して順序関係はないのでboost::mpl::sortを実行することができません。
そこで>>99のような型毎に静的にユニークな数字を割り当ててboost::mpl::sortを適応させることができるようにしたいです。

長くなりましたが、皆様宜しくお願いします。
126 :
2008/06/01(日) 04:09:25
ムリじゃない?
分割コンパイルみたいな局面を考えると、ある型にユニークな数字が割り当て済かどうかすら判らんと思う。
リンカと連携すればいいんだろうけど、C++の規格はそこまで考えてないんじゃない?

指定された型のstaticポインタを用意してそのアドレスを使えばなんとかなるかも知れんが、どうなんだろ?
void*にキャストすれば比較もできるんじゃね?
127 :
2008/06/01(日) 18:57:02
そもそも数字の割り当て方を制御できないとソートする意味がなくね?
どう割り当てたいの?
128 :
2008/06/01(日) 19:09:24
どんな数値でもいいから割り当ててしまえば二分探索の恩恵を受けられるってことだろ
129 :
2008/06/02(月) 02:49:12
>>126
やはり無理なんですかね。
アドレスを得られるのはコンパイルのテンプレートの展開等の後の段階になるので無理だと思うのですが。

>>127
>>125で書いてある通り,型の集合の中に同じ型が含まれないようにすることが目的なので
boost::mpl::uniqueする前に同じ型が連続して並ぶようにboost::mpl::sortの結果が返ればよいのです。
ですので割り当てたい数字は型毎にユニークであれば何でもよいのです。アドレスもOK養豚場です。

>>128
二分探索を使って同じ型を消す処理をしてもO(n*log(n))で計算できそうですね。
そういう方法は考えていませんでした。
130 :
2008/06/02(月) 03:18:17
>>125
で書いた事をもう少しわかりやすく説明すると
例えば以下のような型があったとき、
typedef boost::fusion::vector<char, int, char, int> vec;
vecから重複する型を削除してユニークな型を保持するようにしたいのです。
typedef hoge<vec>::type unique_vec; //こんなhogeを欲しているのです.
BOOST_MPL_ASSERT(( boost::is_same<unique_vec, boost::fusion::vector<char, int> > ))

それで、以下の仮想コードのような方法を使とO(n*n)の計算時間が掛ります.
for i∈vec
 for j∈vec
  もしiとjが同じ型だったらjをvecからはずす.

そこで
typedef
boost::mpl::unique<
 boost::mpl::sort<
  vec, piyo>::type,
 is_same<_1, _2> >::type
unique_vec;
とやればO(n*log(n))の計算量で済みます。
そこで上記のpiyoに相当するMetafunction class、
すなわち型に順序関係を与える方法を教えて貰いたいのです。

>>128
referenceにはboost::mpl::findは線形時間が掛ると書いてあるので
二分探索するには自分でコードを書かないといけないようです.
131 :
2008/07/09(水) 14:39:37
>>124
静的(コンパイル時完全評価)だけどな。

VIPのスレで昔テンプレートでアッカーマン関数の問題解こうとしてドツボにハマった奴がいた。
132 :
デフォルトの名無しさん
2008/07/16(水) 20:46:07
『Modern C++ Design―ジェネリック・プログラミングおよびデザイン・
パターンを利用するための究極のテンプレート活用術 (C++ In‐Depth Series) 』

ってのを読んでいる素人だけど、69ページのMostDerivedってのが
マジ分からん。今日、朝、昼、晩を合計で4時間ぐらい考えたんだが
どういう流れでこれで継承関係でいちばんの派生なのを特定できるのか
分からん。誰か分かる人いませんか?
133 :
デフォルトの名無しさん
2008/07/16(水) 21:05:22
結局、
typedef typename MostDerived<Tail, T>::Result Candidate;
では、再帰的に展開が繰り返され、MostDerived<NullType, T>に
なり、CandidateはTにしかなりえない

続く、
typedef typename Select<
SUPERSUBCLASS(Candidate, Head),
Head,
Candidate
>::Result ResultではCandidateはTと読み替えられるわけで

TがHeadのスーパークラスなら結果はHead
HeadがTのスーパークラスなら結果はTとなる

これじゃ全然ダメじゃね?

ググってみたけど、MostDerivedはダメだったって話を他でも見かけたよ
134 :
2008/07/26(土) 05:07:27
>133
>typedef typename MostDerived<Tail, T>::Result Candidate;
>では、再帰的に展開が繰り返され、MostDerived<NullType, T>に
>なり、CandidateはTにしかなりえない

どの段階で T にしかなりえないと思ってるのか分からないけどちゃんと再帰的に展開できてる?
MostDerived<TypeList<T0, TypeList<T1, NullType> >, T>::Candidate
# Head=T0, Tail=TypeList<T1, NullType>
→MostDerived<TypeList<T1, NullType>, T>::Result
# Head=T1, Tail=NullType
→Select<SUPERSUBCLASS(MostDerived<NullType, T>::Result, T1), T1, MostDerived<NullType, T>::Result>::Result
# MostDerived<NullType, T>::Result → T
→Select<SUPERSUBCLASS(T, T1), T1, T>::Result

結果として、
MostDerived<TypeList<T0, TypeList<T1, NullType> >, T>::Result
→Select<SUPERSUBCLASS(Select<SUPERSUBCLASS(T, T1), T1, T>::Result, T0), T0, Select<SUPERSUBCLASS(T, T1), T1, T>::Result>::Result
T と T1 を比較した結果、と T0 を比較した結果が返ってくる。
135 :
2008/08/30(土) 14:17:24
ttp://www.fides.dti.ne.jp/~oka-t/cpplab-tips-1.html に
ローカルクラスの静的関数は関数テンプレートの引数に指定可能というのがあるのですが、
ローカルクラスのクラス内クラスの場合どうなりますか?
役立たずVC8だとノーチェックでOKにしたので確認できませんでした。
void func() {
   struct local {
      void operator()(int x) { cout << x << endl; }
      static void f( int x ) { cout << x << endl; }
      struct func {
         void operator()(int x) { cout << x << endl; }
      };
   };
   std::vector<int> v;
   v.push_back(0);
   v.push_back(1);
   v.push_back(2);
   for_each( v.begin(), v.end(), local::f );
   for_each( vbegin(), v.end(), local::func() );  // これはどうなるの?
   for_each( v.begin(), v.end(), local() ); //ホントはエラーのはず。VC8.0はOK……
}
136 :
2008/08/30(土) 15:00:49
VCだと言語拡張を有効にすることで関数内構造体もテンプレート引数に渡せてしまう。
俺はそれが嫌で言語拡張を無効にしてる。
137 :
2008/08/30(土) 16:07:38
>136
サンクス。無効にすると両方ともNGになりますね。
言語拡張を無効にすると色々なライブラリが使い物にならなくなるから、
さすがにそこまでストイックにはなれないなぁ……
138 :
2008/08/31(日) 17:08:18
言語拡張機能が使用された場合に警告を出すってオプションがあったと
思うんで、取り合えずそれONにしとけば?
139 :
2008/08/31(日) 17:37:41
そんなもの存在しません。
140 :
デフォルトの名無しさん
2008/10/14(火) 17:41:25
工エエェェ(´д`)ェェエエ工工
141 :
2008/10/18(土) 22:01:41
template <template <class Created> class CreatePolicy>

これのtemplate <class Create>部分の採用がヨクワカラナイ
どこかに良い説明のってないっすか
142 :
2008/10/19(日) 02:40:29
とりあえず検索用語だけ
template-template-parameters
143 :
2008/10/24(金) 23:27:12
class Hoge {
template <int X> void Fuga() {...}
};

テンプレート引数Xの値を、静的な値として集めることってできますか?
具体的には、呼び出されたFugaのうち、最も大きいXを取得して、別のクラステンプレートに渡すとか。
144 :
2008/10/26(日) 01:21:18
>>143
パッとみて無理っぽいうえにコンパイル単位をまたぐ場合を考えるとさらに無理っぽい。
145 :
2008/10/30(木) 20:35:00
(´;ω;`)
146 :
2008/11/26(水) 04:36:26
>>142
横だけど、meta templateでググっても見つからなく困っていたので助かった。
そういう用語だったのか…
147 :
99
2009/01/12(月) 20:40:07
まいど。

どうしても欲しくなったのでマルチメソッドを実装したんだけど、もっと効率的になる改善点てあります?
(詳細)ttp://cvs.sourceforge.jp/view/siki/siki/src/holder.hpp?rev=1.1&view=markup
(解説)ttp://fiercewinds.net/siki/pub/2009/01/12_191240/
解説がクソなのは置いといて下さい。

もっと良い実装があればそれも紹介して欲しいです。

個人的には
・いちいち登録しなきゃいけないのが面倒。
・トランポリン関数を保持する配列が疎になるのでメモリ効率が悪そう……
というところが気になるところです。

148 :
2009/01/13(火) 00:44:59
ちょっとだけ >147を修正。
登録をヘルパークラスに任せることにしました。少しはスマートに見えるけど、受け入れる型を
全部登録しなきゃいけないのは変わらず……

色々と考えてみたけど、どうやっても仮想関数に型情報は渡せなさそうね……。
149 :
2009/01/13(火) 01:15:20
リンク間違えてたので修正します。
(詳細)ttp://cvs.sourceforge.jp/view/siki/siki/src/holder.hpp?view=markup
150 :
2009/01/19(月) 20:24:39
ポリシーによるプログラミングで質問です。
適当な乱数を発生させるTraitsクラスを何個か定義します。
 struct r {int rdm(){return rand()%128;}};
 struct rs{int rdm(){return rand()%7+60;}};
そんで、Traitsを使うクラスがこれ。ここまでは順調です。
 template <class T=r> class R{int rdm(){return T.rdm();}};

この後、rdm関数が引数を持つようなTraitsを加えようとすると型があわないため困りました。
しかし、こういうケースは良くあるのではないかと思います。
 struct rc{int rdm(int n){return n*(rand()%128);}

少し悩んでこんな解を出して見たのですが
こういう場合、みなさんどのように解決されますか?
template <int N> struct rt{int rdm(){return N*(rand()%128);}
R<rt<3> > r;
↑この場合、途中で引数を変えたいと思った場合毎回インスタンスを作る必要がある点が若干面倒です。
また、整数引数しか使えません
関数でやる場合は引数変更は楽ですが
Traitsにあたるものが増えてくると関数の組み合わせ爆発が大変です。
手法にこだわりはないのでこのやり方が楽、などあればきいてみたいです。
151 :
2009/01/19(月) 20:35:21
struct r{ int rdm(){ return rand() % 128; } };
struct rs{ int rdm(){ return rand() % 7 + 60 } };
template<typename Ty> struct rc{ Ty value; int rdm(){ return value * (rand() % 128); } };
後はrc::valueのゲッター書くなりセッター書くなりしろ。
152 :
2009/01/19(月) 21:33:25
>>151
ありがとう。参考にします。
153 :
2009/01/19(月) 23:44:40
STL コンテナでアロケータを指定する方法を真似するのは、何か都合が悪いの?

template <class T=r > struct R {
 T t;
 R( const T & t_ = T() ) : t(t_) {}
 int rdm() { return t.rdm(); }
};

R< random_with_number > rn( random_with_number(3) );
154 :
2009/01/24(土) 14:16:13
>>153
これは良いですね!頂きます。
使ってみて、若干罠というか、引数なし版はプロトタイプ宣言と勘違いされるため
 R<r> a(r()); //error
こうする必要があるんですね(もっと良いやり方があるのかは知らないですが・・)
 R<r> b(*(new r()));

これを参考に、少し書き換えて見ました
struct b {virtual int rdm(){return 0;}};
struct r:b {int rdm(){return rand()%128;}};
struct rs:b{int rdm(){return rand()%7+60;}};
struct rc:b{
int val;
rc(int n) : val(n){}
int rdm(){int tmp=rand()%7;if(tmp%val==0){return tmp;}else{return rdm();}}};

template <class T=b > struct Q {
T* t;
Q( T* t_) : t(t_){}
int rdm() { return t->rdm();}
};
Q<> a(new rc(3));
Q<> b(new r());
155 :
2009/01/24(土) 14:55:23
>>154
>  R<r> a(r()); //error
R<r> a((r()));
でいけるよ
156 :
2009/01/24(土) 15:15:23
ほんとだ、こっちのが短くていいですね。
157 :
2009/01/24(土) 15:27:24
struct b::rdm() を virtual にするなら template にする意味は無いと思うのだけれども・・・。

struct Q { // non template version
 b * t;
 Q( b * const t_) : t( t_ ? t_ : new b ){}
 ~Q() { /* Do you want to delete t ? */
 int rdm() { return t->rdm();}
};
でいいでしょ。

ポインタじゃなくて、値のコピーのほうが、いろいろいいよ。
158 :
2009/01/24(土) 16:08:53
単に左辺を書かなくても良くなるぐらいの気持ちで書き直したんですが
そもそもtenmplate無くても動きますね・・難しいなぁ
ある意味、template使わなくてもポリシーベースのプログラミングが出来るわけですね
あえてtemplateを使う利点が整理できてないので考えてみます。

>ポインタじゃなくて、値のコピーのほうが、いろいろいいよ。
シンプルながら、これは説得力ありますね
159 :
2009/01/24(土) 16:43:24
>>155-156
R<r> a;でいいじゃない。
160 :
2009/01/24(土) 17:11:30
>>158
> あえてtemplateを使う利点が整理できてないので考えてみます。
157 では、t->rdm() は、コンパイラによって必ず仮想関数呼び出しコードが出力される。
テンプレートバージョンでは、定数を返す場合などには、もしかしたらコードは全く無くなるかもしれない。
153 程度で大げさな、と思うかもしれないが、これもメタプログラミングだ。
実行時に通過するコードではなく、コンパイルで出力されるコードを、引数で変えることが出来るから。
C のプリプロセッサマクロでも出来るけど、C++ template は型チェックとそこから派生する特殊化された型の選択が強み。

> シンプルながら、これは説得力ありますね
157 の Q のデストラクタを見てみて。
あと、メモリ消費量が減るかも。


ところで、154 の記法の問題は、cl, bcc, gcc で試したけど、
 R<r> a( (r)r() );
が一番互換性が高いようだ。
もちろん 159 でいいんだけどw 引数を明示したいならね。
161 :
2009/01/24(土) 18:32:50
> R<r> a( (r)r() );

たまたま‘r’という短い名前だからそれでいいかもしれんが、
名前が長かったり、さらにネストしたテンプレートクラスだったりすると
書くのも面倒だよ。

他にも
 R<r> a = R<r>(r());
とか考えられるけど、やっぱり
 R<r> a((r()));
が楽だと思うけどね。
162 :
2009/02/14(土) 00:35:29
age
163 :
2009/03/12(木) 22:20:49
テンプレートの引数にテンプレート渡せるのか〜知らなかった。
これで大分やれることが広がったぜ。ウヒヒ
ていうか、テンプレートの完全な仕様ってどこに行けばみれるの?
164 :
2009/03/12(木) 22:27:47
>>163
ちょうどこっちでその話があったところ。
http://pc11.2ch.net/test/read.cgi/tech/1234420483/758-767
165 :
デフォルトの名無しさん
2009/04/06(月) 19:01:46
Modern C++ Design(和訳)の正誤表を確認したいのだけど、どこかにないかな?
ぐぐると↓のURLらしいが、今はアクセスできないようだ・・。

http://www.biwa.ne.jp/~mmura/ModernC++Design/errata.html
166 :
2009/04/06(月) 20:06:32
167 :
2009/04/06(月) 20:20:17
>>166
う〜ん、そこからのリンクも切れてるなぁ。
http://www.biwa.ne.jp/~mmura/ModernC++Design/index.html
168 :
2009/04/06(月) 20:28:42
ttp://web.archive.org/web/*/http://www.biwa.ne.jp/~mmura/ModernC++Design/index.html
169 :
2009/04/06(月) 21:05:05
>>167
>う〜ん、そこからのリンクも切れてるなぁ。
これでリンクが切れてるなんて言うお前に、Modern C++ Design rokiは無理
170 :
2009/04/06(月) 21:08:12
Loki とroki さてどっちでしょう
>>165には関係ない話題ですがww
171 :
2009/04/06(月) 21:28:26
流れを気にせず好き勝手に意見を述べるが
先に関数型を勉強してからMC++Dを読む方が
すっきり理解出来る気がする

要は、既に確立した技術をC++に応用したわけだが
このロシアおっさんのとんでもない所は
要素技術とでも言うべき箇所、
例えば...やらsizeofの評価順序やら型としてのstructやらを
C++の仕様から見つけ出したところだと思うわ。
コンパイラが対応してない時代にどんだけ仕様把握してるんだよ
パねぇっす
宇宙ヤヴァイの改変コピペが作りたくなるぐらい。
172 :
2009/04/06(月) 21:45:55
でもconceptがまともに使えるようになるまでC++でプログラミングしたくないよねーってなるよ
173 :
2009/04/06(月) 22:22:49
少年アシベで
アイスをねだるゴマちゃんに
豆腐を与える静的なダックタイピング

structuralなポリモフィズムのことだっけ?
C++0xでたら考えよう。それまでは関数型で遊んでる

ところで、ポリシーによるプログラミングが
綺麗に適用出来るケースって、結構少ない気がするんだ
AがB/C/Dで代替出来るケースよりも
AがA(B)やA(B(C))で代替とするケースのほうが
プログラミングしてて多いように感じる
174 :
2009/04/07(火) 03:26:42
>>168
助かったよ。ありがと。
175 :
2009/04/07(火) 03:30:43
>>171
たしかにlambdaとかbind(束縛)なんて単語に馴染みあるかないかでも理解スピードは
違うだろうな。

つかなんで無理やりC++でここまで頑張るのか不思議だ。
176 :
2009/04/10(金) 12:34:36
暇なんだろ
177 :
2009/04/12(日) 21:54:11
boostのlambdaは、確かに実用性に欠ける
あれの意味不明なエラーメッセージと格闘してる暇があるなら
普通に関数オブジェクト作った方が早い
178 :
2009/04/12(日) 23:23:17
書いてる段階でエラーに気づかないほど複雑なものをboost::lambdaで書こうとするのが間違い。
179 :
2009/04/13(月) 00:15:53
そもそもC++で関数型をやるのが間違い
180 :
2009/04/13(月) 04:44:23
C++0x!はやくきてくれー!
181 :
2009/04/28(火) 21:51:49
永遠にこないでくれ

by 製品コンパイラ開発者
182 :
2009/04/29(水) 12:40:40
その程度のコンパイラ開発者なら要らん。
183 :
2009/08/12(水) 01:02:13
そうです TMPは導入されたのではありません
発見されたのです!
184 :
2009/08/17(月) 17:49:45
自動焼人 ★ = 自動保守 ◆KAWORUKOFI = 自動保守#K9K?_D[L

名言集 その4
『俺、100人規模の集団サイバーテロの主犯だったこともあるんだぜ』

http://yutori7.2ch.net/test/read.cgi/news4vip/1249830540/ のID:PVAf+dux0 = 自動焼人 ★

> 965 :以下、名無しにかわりましてVIPがお送りします [sage] :2009/08/10(月) 00:02:09.35 ID:PVAf+dux0
> まぁ何だ。
> 俺の過去の経歴に比べたら、割れ厨なんて鼻くそレベルなんだけどなw
> 100人規模の集団サイバーテロの主犯とか、いろいろとな。


----------------------------------------------
この自動焼人 ★メールマガジンの配信停止をご希望される方は
http://qb5.2ch.net/test/read.cgi/sec2chd/1250169591/
にて自動焼人 ★までご連絡ください
185 :
デフォルトの名無しさん
2009/09/04(金) 17:57:25
テンプレートメタで仮想関数の有無を調べることは
できないでしょうか?
今の知識では思い浮かばない・・
186 :
2009/09/04(金) 18:47:50
その関数がPOD型かどうかを見るよろし
187 :
2009/09/07(月) 01:32:34
関数がPODてなんじゃらほい。

クラスに仮想関数があるかどうかの話なら、boostのis_polymorphic
ですね。チェック対象クラスを継承した2つの同等なローカルクラスを
用意。但し片方はvirtualデストラクタ付きにしといて、2つの
sizeofの結果が同値なら元からvtbl付だった -> 仮想関数あった。
188 :
2009/09/08(火) 11:57:34
なるほどー。質問者じゃないけど勉強になった
189 :
2009/09/08(火) 13:20:46
MPLのスレとかあるのかなぁ、と思ってJaneのスレタイ検索窓に"MPL"と入れたら
ここが候補に挙がって、一瞬ものすごいインテリジェントな検索機能に見えた
190 :
2009/09/08(火) 13:31:51
なるほど、teMPLateなのか。
191 :
デフォルトの名無しさん
2009/09/09(水) 13:08:44
>>165

Modern C++ Design の正誤表はこちらに移動していました。
http://web.me.com/masaaki.murakami/sites/ModernC++Design/
192 :
2009/09/10(木) 21:26:18
なんでも出来るなC++
193 :
2009/09/17(木) 13:05:39
クラスに対してユニークなコンパイル時定数を割り振る方法ってある?
194 :
2009/09/17(木) 13:17:57
MPLでそんなことができたかも知れない
195 :
2009/09/17(木) 13:27:39
typeid(T) じゃだめ?
196 :
2009/09/17(木) 13:30:55
数年前typeof作れないかとそれやろうとしてたけど無理っぽかった。
197 :
2009/09/17(木) 14:43:18
C++0xでそんなことができたかも知れない
198 :
デフォルトの名無しさん
2009/09/17(木) 14:56:10
確率計算の為のクラスを造るとします
内部でリストを持ち
要素の連綿の登録後
この要素は何個あるとか確率はなんぼとか返せるように造ると

しかし要素がペアだった時は同時確率を求められるようにしたいとします
その為に内部ではリストでなくマップで持つとします
k->v
これで(3,6)は何個とか瞬時に返せます

ここで困ったのです
ペアのペアで要素登録すると
(k1->v1)->(k2->v2)で管理するのでなく
k1->k2->k3->vとして欲しいのです
(1,8,4,3)は何個とか瞬時に返して欲しい

TMPなら解決できますか?
必要な深度のメタマップクラスを造ってくれるんです
199 :
2009/09/17(木) 15:00:05
どっちかというと要素を専用のクラスにして、そのクラスのリストを持つべきなんじゃ?
200 :
2009/09/18(金) 08:17:15
>>193
staticメンバのアドレスを取るとか…
201 :
2009/09/18(金) 08:17:56
ああ、コンパイルタイム定数じゃないから駄目だな
202 :
2009/09/19(土) 21:39:29
>193
懐しい話題だな。
分割コンパイルが可能なうちは不可能だと思う。リンカと連動できれば違うんだろうけど。
実行時で良ければ>99だな。最近のコンパイラだったらそこそこ最適化できるんじゃない?

応用例をboost vaultに突っ込んでみたけど、誰も興味なさそうさんで絶賛放置中
ttp://www.boostpro.com/vault/index.php?action=downloadfile&filename=holder.zip&directory=Data%20Structures&
203 :
2009/09/19(土) 23:32:48
久しぶりにプログラム板見たら、こんなスレが出来ていたので少しびっくり、
map のハッシュ値からキー値を検索するようなアルゴリズムって無いのでしょうか?
pair でmap へinsert した値を相互(キー値、ハッシュ値)で検索し合えれば
少し幸せになれるかと思いました、質問させてください、よろしく。
204 :
2009/09/19(土) 23:36:31
>>203 boost::multi_index
205 :
2009/09/19(土) 23:58:20
>>204 Thxです
流石boost いろいろそろってますね。
206 :
2009/09/20(日) 01:25:15
static const char* foo = "FOO";
これを
static char* foo = "FOO";
このような型に変換したいのですが
template を用いてconst 剥がしが出来ないでしょうか?
207 :
2009/09/20(日) 01:27:50
>>206
すでに変換できてるように見えるんだが、何がしたいんだって?
208 :
2009/09/20(日) 01:50:50
>>206です
配列foo を、こんな感じで、使いたいんだけど、const が付いてると
first = foo;
ここで引っ掛かってコンパイルが通らないので、一時的にconst 剥がしが出来ないものかと、子一時間です。

template<class Iterator, class T>
Iterator search(T target)
{
static const char* foo = "FOO";
T* top;
T* first;
first = foo;
top = first;
〜省略〜
}
209 :
2009/09/20(日) 01:58:57
>>208
const_cast でコンパイルは通せるけど、書き込んじゃダメなのは変わらないんだから、
first に const 付ければいいんじゃないの?
210 :
2009/09/20(日) 02:11:35
>>208 です
>>209
なるほど
const T* top;
const T* first;
これで、いけました、処でまだconst 剥がしに拘るんだけど
template <class T>
struct remove_const {
typedef T type;
};

template <class T>
struct remove_const<const T> {
typedef T type;
};
こんなtemplate があったとしも、これでは
static const char* foo = "FOO";
この、const 剥がせません無いのですが、いい方法が無いんでしょうか?
211 :
2009/09/20(日) 02:21:41
それはconst_castの仕事でござるよ
212 :
2009/09/20(日) 08:54:19
>>211
だがしかし、それは悪い方法である。

剥がさないのがいい方法ね。 >>210
213 :
2009/09/20(日) 09:57:31
const剥がしの目的にもよるが、面倒とかよく分からないとかいう理由で剥がすのは
危険だからちゃんと慣れるべき。Cでポインタ分からないままコーディングするのに
近いレベル。
constを剥がす正当な理由は、「const非対応な古いコードor糞コードと組み合わせ
なきゃならない時に仕方なく」というもの。それはconst_castでやる。
const剥がしのキャストは一見大したこと無いけど、見た目よりは危険だから避ける
べき。
214 :
2009/09/20(日) 13:15:10
メタ関数で階乗などの整数値を計算できるのは理解したんですが
円周率などの実数値を計算することはできないんでしょうか?
215 :
2009/09/20(日) 13:22:41
浮動小数の仕組みを思い出そう。
216 :
2009/09/20(日) 13:47:51
実数のような無限列はそもそもコンピュータでは扱えない。
浮動小数に近似するとしても、どこまで近似するかという問題があるから簡単には扱えんよ。
217 :
2009/09/20(日) 17:09:41
逆に、どこまで近似するか決めれば扱えるんじゃね?
218 :
2009/09/20(日) 17:11:52
MPLで浮動小数使いたければfloatやdoubleをコンピュータが内部でやってるのと同じ事をMPLですればいい。
ただものすごく面倒臭いし遅い。
0xではコンパイルタイムにfloatとdouble使えるけどね^ε^
219 :
2009/09/20(日) 17:17:11
どこまで近似するか決めないと浮動小数演算そのものが無理だしな
コンパイルが糞遅いのは、プリコンパイルヘッダが優秀なコンパイラならマシになる
かもしれない

でもまぁ現実的に考えればC++0x待ち
220 :
2009/09/20(日) 18:07:14
現行では整数の対で有理数を作って近似するしか無いね。
constexprの実装まだー。
221 :
2009/10/02(金) 17:47:34
あるクラスが
・メンバ変数Xをもっているか否か
・メンバ関数Yをもっているか否か
を調べる方法はありますん?
typedef Zを持っているかどうかはわかったんですが・・・
222 :
2009/10/02(金) 17:58:25
ちなみにやりたいことは
operator []を持ってれば
template <class T>
void f(const T &val)
{
cout << val[0];
}

operator []を持ってなくてfirstを持ってれば
template <class T>
void f(const T &val)
{
cout << val.first;
}

それ以外はコンパイルエラー

といった感じで分岐させたいです
223 :
2009/10/02(金) 18:25:38
BOOST_MPL_HAS_XXX_TRAIT_DEFを使うとか?
224 :
2009/10/04(日) 09:07:43
>221
移植性のある方法では現行 C++ では出来ないと思う。
VC だと __if_exists があるし、処理系によっては SFINAE の適用範囲が広くて使えるかもしれない。
無理して頑張ったところでどうせ意味論までは確認できないんだから、素直に traits クラス作っちゃった方がいいんじゃないかな。
225 :
2009/10/04(日) 16:21:57
Boostライブラリはたまに移植性のない方法を無理矢理カバーしてるからなぁ
あとC++0xなら普通に作るはず
226 :
2009/10/12(月) 16:26:18
TMPを発見するような事を真にハックするって言うんだよな
227 :
2009/10/17(土) 13:31:04
コンパイル時に文字列って操作できる?
staticな配列が無いからタイプリストにchar2typeを詰め込んで・・・とか思ったけどすごいめんどくさそうだ
228 :
2009/10/17(土) 13:33:06
>>227 boost::mpl::string で?
229 :
2009/10/17(土) 13:37:29
もっと具体的にどういう操作がしたいんだ
230 :
2009/10/17(土) 14:00:30
文字列の基本的な操作ができないものかなと
cpy,cat,cmp・・・などができて、実行時にはゼロ終端かstd::stringで取り出せる
みたいな感じで
231 :
2009/10/17(土) 14:06:55
まぁ何だ、プリプロセッサも立派なメタプログラミングだぜ!
232 :
2009/10/17(土) 15:49:24
機能的制約はあっても制約を記述できない「ベーシックですか?」的なメタだけどな
233 :
2009/10/17(土) 18:17:29
>230
>228 の言うとおり boost::mpl::string でできるだろう。

ドキュメントのサンプルより:
>typedef mpl::string<'hell','o wo','rld'> hello;
>typedef mpl::push_back<hello, mpl::char_<'!'> >::type hello2;
>
>BOOST_ASSERT(0 == std::strcmp(mpl::c_str<hello2>::value, "hello world!"));
234 :
2009/10/17(土) 18:58:20
それ4文字以下のセットじゃないと使えないししかも環境依存しまくりじゃなかったっけ?
235 :
2009/10/17(土) 21:13:26
>234
multicharacter literal についてならその通り。4文字以下ってのも実装依存っぽいけど。
その辺は吸収するつもりなんだろ、きっと。primary test compilers だと test は全部通ってるみたい。
後、嫌だったら別に一文字づつ書いても構わないみたいだ。
236 :
2009/11/09(月) 12:25:10
TMPを理解するのに必要なIQはいくつですか?
126しか無いんですが、難しいですか?
237 :
2009/11/09(月) 12:35:12
しらねーけど子供の頃130だった俺は楽勝だから126でも大差ねーだろ
238 :
2009/11/09(月) 12:36:16
>>236
IQとTMPの理解にリニアな相関性はありません。
IQが多少低くてもセンスがあれば理解できるでしょう。
239 :
2009/11/09(月) 17:37:20
TMPが難しいのは修得人口が少ない(よって解説も少ない)のと
C++のテンプレートが元々TMP用のものではないことによる不合理性が原因。
別に理論として難しいわけじゃない。
240 :
2009/11/09(月) 18:12:34
メタしないC++になんの価値が有るの
いまどき
241 :
2009/11/09(月) 18:20:36
なんだと
メタメタにしてやろうか小僧
242 :
2009/11/10(火) 05:49:32
C/C++のエラーチェックにこれまでGNU nanaを使ってきました。
boostにそういうものってありますか?
>>233にある

BOOST_ASSERT

あたりがそれですか?
243 :
2009/11/10(火) 20:49:10
継承してる一番遠いサブクラスのサイズをコンパイル時に取得できる?
244 :
2009/11/10(火) 20:53:17
オンナスキーっていうレズキャラだせばよかったのに
245 :
2009/11/20(金) 11:26:19
template <class Gadget> class Widget
{
public:
    Widget(???) : m_gadget(???) {}

private:
    Gadget m_gadget;
};

m_gadgetをデフォルト以外で初期化したい、初期化パラメータはクライアントが選べるようにしたい
でもWidgetはGadgetのことをよく知らないのでコンストラクタにどんな引数を持つべきかわからない
これを解決したいんですが、Widgetの???をテンプレートパラメータから決定することはできますか?
246 :
2009/11/20(金) 11:37:48
c++0x なら
Gadgetのコンストラクタ引数を可変引数 template にして:

template <class Gadget, typename... Args>
class Widget {
public:
  Widget(Args... args): m_gadget(args...) {}

private:
  Gadget m_gadget;
};
247 :
2009/11/20(金) 11:41:46
template <class Gadget>
class Widget {
public:
  template <typename... Args>
  Widget(Args... args): m_gadget(args...) {}

private:
  Gadget m_gadget;
};

の方がいいか。
248 :
2009/11/21(土) 01:29:04
どうせなら perfect forwarding にしたいかもね。
別解として Boost In Place Factory とか。
249 :
2009/11/21(土) 17:54:20
ポリシーとトレイツのしっかりとした定義がわからない

template <class T> class X : public T
{
using T::func;
using T::num; int a[num];
};

↑こういうのってtraitsなの?policyなの?
250 :
2009/12/02(水) 00:31:19
enable_ifか何かで定数の比較( > とか <= )で
templateの特殊化分岐ってできましたっけ?
251 :
2009/12/02(水) 00:44:28
enable_if_cだった
252 :
2009/12/02(水) 15:34:58
そりゃできるだろ
253 :
2009/12/02(水) 17:39:30
眠かったので分けの分からん文章書いてしまいましたが、
250書いたすぐ後にenable_if_cで定数比較ができるのが分かりました。
<enable_if使ってできねーできねー言って悩んでたまぬけ
254 :
2009/12/02(水) 18:20:37
enable_ifでもMPLのint_とか適当に使えば行けるとは思うが、まぁenable_if_cで
済んでるのを無駄にややこしくする必要は無いな
255 :
2009/12/13(日) 11:27:26
struct Foo {
template <typename F> Foo(F f)
{
typedef typename boost::mpl::if_c<boost::is_pointer<F>::value, function_ptr_tag, function_obj_tag>::type tag;
// do something
}
}
みたいに関数へのポインタか関数オブジェクトを渡す際、
関数オブジェクトのコピーを抑制するにはどうすれば良いんでしょうか? boost::ref 以外で。
関数オブジェクトの所有権を Foo 側で持ちたいので、最低 1 回のコピーだけで済ませたいのですが。
一応、試しに Foo (const F& f) としてみたら期待通りに動いたんですが、
boost::function とかはそういう実装になってないから、何か問題があるんだと思ったのですが。
256 :
2010/01/13(水) 10:59:25
ひょっとして今のテンプレメタってC++0x普及したらいらない子状態になるんですか?
257 :
2010/01/13(水) 14:07:48
なるわけがない
258 :
2010/01/13(水) 21:44:04
幾つかのテクニックはいらない子になるだろ
259 :
2010/01/13(水) 23:46:41
それは今のテンプレートメタが要らない子になるとは言わない
260 :
2010/01/22(金) 18:51:33
>>99
やっぱこれすごいわ
よく思いつくなぁ
261 :
2010/01/22(金) 19:33:45
俺はLokiのInt2Typeを見て感動したなぁ。
整数定数を与えると、値ごとに異なる型を返すテンプレート。
99と逆な感じかな。
262 :
2010/01/22(金) 23:23:14
>>99はコード上ではすっきりしてるけど、コンパイルすると普通に条件分岐やフラグ
を含んだコードを生成するよね
別にそれが悪いって訳ではないんだが
263 :
2010/01/23(土) 00:16:20
まあ、条件分岐やフラグをコンパイラに押し付けているのがポイントかね。
遠い将来にC++が自己書き換えプログラムを作るようになったら効率化するかもね。

誰か>202のマルチスレッドにコメントしてくれないかしらん。
boost::anyで標準対応してくれないかなぁ……
264 :
2010/01/23(土) 01:10:26
>>99ってひとつのEXEであれば型の数が確定してると思うけど
最新のVCあたりなら最適化で定数になったりしないの?
265 :
2010/01/23(土) 04:48:19
呼び出される順序で値がかわってくるので完全にconstな関数やインスタンスからしか呼び出されてない場合でないと
定数に展開されない。
266 :
2010/01/23(土) 06:29:14
typeidのアドレスでも使えばいいんじゃないの?
267 :
2010/01/23(土) 12:42:12
というか正直>>99は使えそうで使えない罠コードにしか見えなくね
268 :
2010/01/23(土) 13:22:41
まあ、>99だと普通にマルチスレッドとか鬼門だと思う。

>266
type_infoに一意性てあったっけ?比較はOKだけど。

269 :
2010/02/13(土) 03:10:05
テンプレートのインスタンス化の度にインクリメントされる様な定数は無理ってこと?
270 :
2010/02/13(土) 04:08:21
静的な定数に最適化はされないんじゃね
271 :
2010/02/13(土) 04:09:30
静的じゃなくてコンパイル時定数と言いたかった
272 :
2010/02/27(土) 02:41:28
struct A { B operator (C); D operator (E); };

AとCorEをテンプレートパラメータにしてBorDを得るイディオムって有りますか?
273 :
2010/02/27(土) 03:24:57
C++0xなら decltype((*(A*)nullptr)(*(C*)nullptr))
Aがboostかtr1のresult_ofに対応していれば typename result_of<A(C)>::type
どっちも駄目なら諦める
274 :
2010/04/10(土) 13:56:10
なんか3月にTMPの書籍出てたみたいだけど
どう?買い?
275 :
2010/04/10(土) 17:35:28
どれよ
276 :
2010/04/10(土) 22:47:59
>>275
ISBN-10: 4798120391
(ISBN-13: 978-4798120393)
です
277 :
2010/04/11(日) 21:04:43
>>274
http://vig.pearsoned.com/store/product/1,1207,store-15080_isbn-0321227255,00.html
これの翻訳なんで、まだ読んでなければ必読でしょ。

http://www.vandevoorde.com/C++Templates/
これの翻訳も出たよね。

どっちも訳がいいかどうかは知らないけど、
template好きは、訳が悪くても読まないとね。
278 :
2010/04/11(日) 21:07:01
template好きはたぶん原書で読んでる
ちょっと好きなだけの俺は邦訳を買ってみよう
279 :
2010/04/17(土) 15:25:59
原著たかくね?
280 :
2010/04/17(土) 15:51:30
内容考えれば安い。
これだけ高度な内容の方が出ている言語は珍しい。
281 :
2010/04/17(土) 21:56:32
隠し芸と言うか裏芸というか、こういう技覚えて皆実践してんの?
282 :
2010/04/19(月) 12:10:26
type erasureが必要だったから覚えた
この程度に使うだけならそれほど難しいものでもないし
283 :
2010/05/29(土) 08:30:45
メンバでない関数
namespace x
{
r f(a1, a2, ...);
}
が存在するかどうか調べることってできる?
リンクできるかどうかは流石に無理だろうから、宣言できるかどうかだけでも調べたい
284 :
2010/05/30(日) 15:05:19
>283
どこまで厳密に調べたいかによるけどものすごく適当にやるとこんな感じ?
ttp://codepad.org/aNznrWhl
285 :
2010/06/01(火) 22:24:28
int i;
hoge h;
fuga f;
piyo p;
for_each(i, h, f, p).do(print);

とか

int i, j;
hoge *p, *q;
for_each_pair({i, j}, {p, q}).do(swap);

みたいな書き方を実現するテンプラテクニックってありますか?
c++0xのみ可でもおkです
286 :
2010/06/01(火) 23:17:24
みたいなと言われてもその表記の意味する所がわからんのだが
287 :
2010/06/02(水) 05:44:28
>>285
異なる型からなるシーケンスにSTLライクにアルゴリズムを適用したいってこと?
後者は知らんが前者は
fusion::for_each(fusion::vector_tie(i, h, f, p), print);
とほぼ同意だからboost::fusionでも参考にすりゃ出来るんじゃないの
288 :
2010/06/02(水) 07:38:19
後者はそもそもi, i, p, qがboost::bariantoじゃないと無理だな
289 :
2010/06/02(水) 07:39:01
bariantoじゃなくてani-な
290 :
2010/06/02(水) 07:40:10
>>287
thxです!
291 :
2010/06/04(金) 04:50:47
ruby厨か・・・
292 :
2010/06/05(土) 10:20:02
ttp://codepad.org/VlTTMgbi

たかがアドレスひとつ取るのにこの人はなんでこんなに頑張ってるんですか?
いったいこのコードにはどんな意味があるんでしょうか?
293 :
2010/06/05(土) 10:26:55
operator& がユーザーにオーバーロードされてても
アドレスを取得できるようにするため
294 :
2010/06/05(土) 10:31:56
なるほど!
295 :
2010/06/05(土) 18:00:02
もちろん、原理を理解したら、普段はboost::adress_ofを使えばいい。
296 :
2010/06/05(土) 18:01:04
すまん、addressofだった
297 :
2010/06/05(土) 18:06:54
普通にアドレスとって欲しくないから&とかオーバーロードするのにキモイキャストまでしてアドレスとるなよって思う
298 :
2010/06/05(土) 20:26:47
COMやってたら CAdapt が必要になるようなケースで
それが必要なくなるということか
どっちもどっちな気もするが
299 :
2010/06/05(土) 21:15:39
ライブラリをジェネリックにしようとすれば
普段はしないような細かい配慮が必要になるってこった。
300 :
2010/06/05(土) 22:21:56
善し悪しはべつにしてなんでvolatileと引数のint longがなんのために存在するのかわからん
301 :
2010/06/07(月) 05:16:51
>>292
のコードで、なんでaddr_impl_refが必要なのかわからない
誰かおせーて
302 :
2010/07/29(木) 21:29:16
自然数の定数nを与えると、n≦m = 1<<x (n以上かつ最小の2のべき乗の値)を求めるテンプレートを組みたいのですが、
どのように組めばよいでしょうか?
例えば以下のコードのような感じで、n=33と与えると64を定数として求めたいのです
size_t m = 1;
while (m < n) m <<= 1; //事前展開してくれない
303 :
2010/07/29(木) 21:47:04
そういうのを見るとつい2の補数のアーキテクチャの時の面白ビット演算をやりたくなるが、
仮にアーキ依存していいとしたらテンプレートでああいうのって可能なんかな
まぁどうでもいいが
304 :
2010/07/30(金) 00:29:00
305 :
2010/07/30(金) 21:29:20
>>304
ありがとうございます
再帰で書き直して置き換える感じなのだと理解しました
size_t binarywrap(size_t n, size_t m = 0) { return m < n ? binarywrap(n, m << 1) : m; }

boostが使えない環境なので以下のようにして使わせていただいてます
template <bool B, size_t T, size_t F> struct binarywrap_t { static const size_t size = T; };
template <size_t T, size_t F> struct binarywrap_t<false, T, F> { static const size_t size = F; };
template <size_t n, size_t m = 1> struct binarywrap {
static const size_t size = binarywrap_t<(m < n), binarywrap<n, (m << 1)>::size, m>::size;
};
template <size_t n> struct binarywrap<n, 0> { static const size_t size = 0; }; // これを省略するとなぜかエラーが出る…なぜだ…
306 :
2010/09/16(木) 12:32:46
基底クラスの数や型を得るメタ関ってできる?
307 :
2010/09/17(金) 16:17:25
>>306
こういうのだろうか
ttp://www.kmonos.net/alang/boost/classes/call_traits.html
ttp://www.kmonos.net/alang/boost/classes/type_traits.html
308 :
デフォルトの名無しさん
2010/10/15(金) 23:05:36
こんなのを作ってみた。マクロ以外の呼び出せるもの
全部同じオブジェクトで呼び出せるクラス。
これもメタプログラミングなのかな?

Delegate<Child*(int,int,int)> method[]=
{
 &functor,  //Child *operator(int,int,int);を定義しているオブジェクト
 &function, //Child *function(int,int,int); 普通の関数
 Type(),  //new Child(int,int,int);コンストラクター Typeは空のクラス
 Delegate<Child(int,int,int)>(&object,&Class::Method) //オブジェクトと関数のペア
};
Delegate<Parent*(int,int,int)> parent_method=method[0]; //変換可能ならキャストできる
使い道としては関数ポインタの代わりとかイベントの伝達につかってるよ。
for(int i=0;i<n;++i)method[i](a,b,c);
309 :
2010/10/16(土) 01:14:25
>>308 boost::function に比べてなんかいいことある?
310 :
2010/10/16(土) 15:17:40
>>309
functionつかった事ないから知らんけど、
bindがあっても無くてもいい所と、コンストラクターになれる所くらい?
あとは、コードサイズが違うかもしれん。
311 :
2010/10/30(土) 10:36:41
>>310
それらはfunctionでもできるね。
>>309
プログラム技術習得として、function相当の機能を作った経験はあったほうがいいと思うぞ。
312 :
2010/11/29(月) 19:12:12
/** 移植性のないユニークな識別子
* 関数定義が増えたり#includeが増えたりすると値が変わる(セクション内の定義位置が変わるので)
*/
//@{
template<class T>
inline unsigned UniqueID() { return reinterpret_cast<unsigned>(UniqueID<T>); }
template<class T>
inline unsigned UniqueID(const T&) { return UniqueID<T>(); }
//@}

template<class T, class U>
inline bool InstanceOf(const U&) { return UniqueID<T>() == UniqueID<U>(); }
template<class T, class U>
inline bool InstanceOf(const T&, const U&) { return InstanceOf<T>( *reinterpret_cast<U*>(0) ); }

template<class T, class U>
inline bool StrictInstanceOf() {
 static_cast<T*>( reinterpret_cast<U*>(0) );
 static_cast<U*>( reinterpret_cast<T*>(0) );
 return true; // 相互に型変換が不可能ならここでコンパイルエラーで止まる
}
template<class T, class U>
inline bool StrictInstanceOf(const U&) {
 return StrictInstanceOf<T, U>();
}
template<class T, class U>
inline bool StrictInstanceOf(const T&, const U&) {
 return StrictInstanceOf<T, U>();
}
313 :
2010/11/29(月) 20:22:18
メンバ関数ポインタを汎用的に格納するにはどうしたらいいんだ
void*じゃダメなのはわかるんだけど
314 :
2010/11/29(月) 22:23:11
Boost.Anyのソースを読むといい。
315 :
2010/11/29(月) 23:12:18
>>313
遅延実行が目的ならstd::function、std::bindが一番頭使わない方法かな
stdになければtr1かboost
あるいは>>308のようにtype erasureやcompositionの技法で
自分で書くこともできるけど、スマポも格納したいとか、safe boolを
実装したいとか、いろいろ考え出すと結構面倒
316 :
2011/02/20(日) 10:54:54.24
このスレちっとも進まないですよね
所詮ねらー風情にはオーバーテクノロジーなんでしょうね
317 :
2011/02/20(日) 11:42:38.46
テンプレートより自家プリプロセッサの方がよくね
318 :
2011/02/20(日) 12:41:31.36
C++0xが普通に使えるようになったらメタ関数をいちいち typename HOGE<HUGA>::type
ってしなくても HOGE<HUGA> で済むようになるから使用頻度は増えると思う。
現行のメタ関数はlazyな解決に使う方向だな。

template<typename MetaFunc> using Eval = typename MetaFunc::type;
template<typename T> struct LazyIdentity { using type = T; };
template<typename T> using Identity = Eval<LazyIdentity<T>>;
319 :
デフォルトの名無しさん
2011/04/27(水) 11:52:39.52
このスレちっとも進まないですよね
所詮ねらー風情にはオーバーテクノロジーなんでしょうね
320 :
2011/04/27(水) 12:03:45.76
C++相談室で十分だから。
321 :
2011/04/30(土) 13:18:16.10
ぶっちゃけこの辺の技術を使うには、ぐぐって自力でどうにかする能力が必須
322 :
2011/04/30(土) 16:15:52.69
ちょっとTMP使うだけでも阿呆のようにコンパイル時間とオブジェクトサイズが増えるのは
早めに何とかしてもらいたいものだ。
コンパイラの人が頑張ればどうにかなるのかはわからないが。
323 :
2011/05/03(火) 11:23:14.13
スクリプトでヘッダとソース生成したほうが簡単柔軟コスト安だよねJK
324 :
2011/05/03(火) 12:50:51.93
>>323
まとめて修正したくなると面倒に・・・
325 :
2011/05/03(火) 18:28:50.62
そもそもその手法にはプリプロセッサマクロと同様の問題がある
326 :
2011/05/03(火) 18:34:49.20
いやぁ、どう考えてもLisp辺りで生成した方が柔軟で面倒が無いわ
327 :
2011/05/03(火) 18:55:31.63
どの辺に時間がかかっているんだろう
328 :
2011/05/03(火) 23:16:20.69
forthみたいなimmediateワード欲しいね。
329 :
2011/05/03(火) 23:31:00.92
>>327
素人考えだと組み合わせの生成と検索じゃね
330 :
2011/05/03(火) 23:34:53.91
TMPやってる人ってコンパイル時にかかるコスト計算とかもしてるの?
これは展開にO(n^2)かかる〜とかこの処理はオーバーヘッドが大きい〜とか
331 :
2011/05/04(水) 02:35:23.67
時間がかかる程高度なことやってる気になる
332 :
2011/05/04(水) 14:06:48.82
>>330
Boost.MPL のアルゴリズムにも計算量が定義されていたりする。
333 :
デフォルトの名無しさん
2011/05/04(水) 14:40:18.86
テンプレートでプログラムを表現するコードを書いてみた。
http://codepad.org/Ol10cCgK
実行時にできる事をテンプレートで作成してもなんの意味も無いけど、
テンプレートプログラムを元にクラスを生成するならオートマトン(構文解析器等)
作成なんかで便利そうな気がする。
334 :
2011/05/06(金) 01:42:38.93
オートマトンでは構文解析はできんぞい
335 :
2011/05/06(金) 02:11:56.61
いや、できるな。ごめん字句解析の限界とスタックをオートマトンで構文解析する方法を混同してた。
336 :
2011/05/06(金) 19:29:58.22
もしかしたら拡張するかもなクラスに
余分に使わないテンプレート引数を設定するのって普通?
337 :
2011/05/06(金) 22:56:44.80
デフォルト引数ってそもそも、引数の変更が有っても
MethodExExExみたいなのを書かないようにする仕組みじゃないのか?
338 :
2011/05/07(土) 00:49:16.57
>>336
後から追加できるのに、わざわざ先手打つ必要ないでしょ。
組み合わせ爆発起きそうなテンプレート群でもない限り。
339 :
2011/05/07(土) 01:35:08.02
>336
拡張した後に特殊化で互換性取った方が良くない?
340 :
2011/05/08(日) 23:27:38.49
クラス定義中に自分自身のサイズを知る方法はある?

template <〜> class hoge
{
typedef hoge this_type;
static unsigned int const this_type_size = ???; // this_typeのサイズを知りたい
};
341 :
2011/05/08(日) 23:29:57.04
template<〜> class hoge{
 enum{ size = sizeof(hoge) };
}

hogeを直接クラス内で書けばテンプレート引数は省略できる。よってthis_typeは必要ない。
staticおよびconst修飾ではなくenumでとるべき。
342 :
2011/05/08(日) 23:42:58.58
>>341
enumを使う必要はない。
今時C++03未対応のコンパイラーなんて、
そもそもテンプレート自体ろくに扱えないだろうし。
343 :
2011/05/09(月) 00:02:27.71
>>340ではないけど。

エラーになったんだけど書き方間違ってる?
ttp://codepad.org/QaDd7R2K
344 :
2011/05/09(月) 05:39:16.38
>>342
VC9.0「はい。」
345 :
2011/05/09(月) 09:28:32.30
class c{
int a[sizeof (c)+1];
};
サイズ取れたらどうなるの?
346 :
2011/05/09(月) 10:06:10.09
クラスはクラス定義の終了以後に定義されるので、
クラス定義内では、クラス名は不完全型として扱われる。
sizeofのオペランドに不完全型を渡すと鼻から悪魔。
そのため、>>341,354のようなコードは不可。

クラス定義内のメンバー関数定義における仮引数と戻り値の型は、
クラス名を使ってもいいとされている。
そうしないと、クラス定義内で自分のクラス型を使うメンバー関数を定義できないから。
347 :
2011/05/09(月) 10:51:44.39
>>346
> sizeofのオペランドに不完全型を渡すと鼻から悪魔。
コンパイルエラーになるだけだよ。
348 :
2011/05/09(月) 11:12:45.24
C++ではそうだけど、sizeofに不完全型を渡すってのが鼻から悪魔の元ネタだからつい。
349 :
2011/05/09(月) 11:26:33.85
>>348
C++のほかにsizeofっていうとCぐらいしか思いつかないんだけど、
Cでも同じでコンパイルエラーになるだけだよ。
元ネタとか、何の話してんの?
350 :
2011/05/09(月) 12:24:44.03
元ネタ?
ttp://groups.google.com/group/comp.std.c/msg/dfe1ef367547684b
上記を元ネタとして言及
ttp://cpplover.blogspot.com/2010/01/c0x_14.html

ただ元ネタ?で引用してる規格でも
> 3.3.3.4 The sizeof Operator
> Constraints
> The sizeof operator shall not be applied to an expression that has function type or an incomplete type,(以下略)
不完全型に適用すべきでないとなっているだけだから
不適切なsizeofを未定義動作になると解釈して鼻から悪魔が出ても文句は言えないと例えたのは元ネタ?を書いた人の誤解のように思える。
(今の感覚では未定義動作になると明言していない以上そもそもコードとして実行しない=その時点でコンパイルエラーにする、と読むほうが自然だと思う)
351 :
2011/05/09(月) 12:37:39.53
「すべきでない」だとほとんど誤訳、誤読に近いね。
(適用する余地が少しはあるように読める)
規約の"shall not"は「してはならない」と訳す。
"shall"は「しなければならない。」
この辺の用語、訳は法令に準じてる。
原文でももちろん同じ。

上のURLの記事はどちらも酷いなw
352 :
2011/05/09(月) 20:18:27.64
353 :
2011/05/09(月) 20:39:26.68
>>350-351
いやshall notに違反したらundefined behaviorだってちゃんと書いてあるだろ
354 :
2011/05/09(月) 22:47:27.65
>>352
あれ?クラス宣言内でデフォルトの引数書けたっけ??
GCC拡張だったような記憶ががががが。。。orz
355 :
2011/05/09(月) 23:58:28.52
>>353
よくわからん。
> If a "shall" or "shall not" requirement that appears outside of a constraint is violated, the behavior is undefined.
というのはみつけたがsizeofの説明はconstraintsなんだから上記には該当しないで
> "shall not" is to be interpreted as a prohibition.
こっちじゃないか?それとも別の記述?
356 :
2011/05/10(火) 00:16:57.23
>>355
ここ。
5.1.1.3 Diagnostics
> A conforming implementation shall produce at least one diagnostic message (...) if
> ... or translation unit contains a violation of any syntax rule or constraint, ...
357 :
2011/05/10(火) 01:28:56.98
>>356
それは診断メッセージの話であって一連の流れとは無関係に思えるけど。
未定義動作の一つとして診断メッセージを出してエラーにするというのはありでも
違反があったときに診断メッセージを出さなければいけないからその違反は未定義動作であるということにはならないでしょう。
358 :
2011/05/10(火) 02:04:23.78
>>357
ごめん。結論をちゃんと書いてなくて紛らわしかったね。
未定義動作にはならなくて、コンパイルエラーになるだけっていうほうの根拠を挙げたつもりだった。
359 :
2011/05/10(火) 11:08:18.36
> constraint
> restriction, either syntactic or semantic, by which the exposition of language elements is to be interpreted
なのでconstraint違反は、interpretされない=コンパイルされない=コンパイルエラーを出して終了、だろう。
だからsizeofに不完全型を渡すは未定義動作じゃなくコンパイルエラーだな。
360 :
2011/05/10(火) 11:12:14.81
そりゃそうだ。
最初から>>347>>349に書いてる奴がいる通りだ。
361 :
2011/05/25(水) 16:23:06.59
TMPで整数型のビット幅を求める完璧な方法はある?
362 :
2011/05/25(水) 17:17:24.99
sizeof(T)*CHAR_BIT こういう話??
363 :
2011/05/25(水) 17:37:36.59
それは全然パーフェクトではないらしいです
364 :
2011/05/25(水) 17:47:52.46
任意の整数値とは書いてないからねー。
365 :
2011/05/25(水) 18:47:17.89
完璧かどうかはわからん
#include <iostream>
#include <limits>
#include <type_traits>

template<class T>
struct Bits {
enum { value = std::numeric_limits< typename std::make_unsigned<T>::type >::digits };
};

int main()
{
std::cout << Bits<int>::value << std::endl;
std::cout << Bits<short>::value << std::endl;
std::cout << Bits<char>::value << std::endl;
return 0;
}
366 :
2011/05/25(水) 18:59:55.35
暇だから任意の数字のビット数出そうとおもったけど何かへんだ。
ttp://ideone.com/CwyGq
367 :
2011/05/25(水) 23:19:50.83
template<class car,class cdr> struct Cell;
typedef Cell<class X,Nil> cell;

 Cellが本体未定義でも使用可能なのと同じで、
Xは未定義でも、template引数に直にclass Xと書いてやれば、
XをCellに渡せる訳だけど、このXどこか広域空間以外の名前空間に
所属させる事できないの?
Xの実体は不要で、templateを特殊化するための識別子としてだけ
使いたいんだけど、広域空間にあると他の名前との干渉が気になって
安易に使えない。
368 :
2011/05/26(木) 00:00:29.35
>>367
namespace CellTags { class X; } とでもしておけばいいんじゃない?
369 :
2011/05/26(木) 00:12:50.55
>>368

struct Example
{
        typedef Cell<class X,Cell<class Y,Nil>> cell;
};
っていうほんと使い捨てな用途に使えないよ。
こんな感じで書くのと変わんないし。
struct Example
{
        typedef Symbol<0> X;
        typedef Symbol<1> Y;
        typedef Cell<X,Cell<Y,Nil>> cell;
};
370 :
2011/05/26(木) 00:47:20.69
>>369
ふーん。
長いサフィックスをつけるマクロでも作れば?
371 :
2011/05/26(木) 00:51:48.23

なるほど。その手があるな。
もう少し代替手段を考えたいとこでもあるけど。
372 :
2011/05/26(木) 01:04:00.31
>367
Cellを含めて適切なnamespaceに置いたら?
373 :
2011/05/26(木) 01:19:44.58
>>372
実際には関数の中で使用するからどこの名前空間で使われるか解らん。
もっと現実に忠実に書くとこんな感じ。

Foo<Evalute< S< Setq,struct X,S<Quote,S<Lambda S<struct Args>, S<いろいろ処理> > > > > > processor(xxx,yyy,zzz);
374 :
2011/05/26(木) 18:49:45.22
それで使い捨てなのか
375 :
2011/05/26(木) 22:05:04.33
TMP
こだわりすぎて
損をする
人に任せて
成果だけ得る
376 :
2011/05/26(木) 22:11:45.99
>>375
Tだすせ得
Tこ損人成

・・・どう読むんだ、
377 :
2011/05/27(金) 00:52:11.46
>373
無茶言うな。
せいぜいCRTP使って唯一性を確認するのが関の山だろ。
とりあえずVC++2010で動いた。鼻から悪魔かもしれんが。
int unique() { static int i(0); return i++; };
template<typename car> struct Cell {
static int id() {
static int i(unique());
return i;
};
};
template<typename T> struct CellTagBase {
template<int i> struct id;
friend T;
};
class Tag : public CellTagBase<Tag> {};
class Tag2 : public CellTagBase<Tag2> {};
// class Tag2 : public CellTagBase<Tag2> {}; --> error
int main(int argc, _TCHAR* argv[])
{
std::cout << Cell<Tag::id<0> >::id() << std::endl;
std::cout << Cell<Tag2::id<1> >::id() << std::endl;
std::cout << Cell<Tag::id<0> >::id() << std::endl;
return 0;
}
378 :
2011/06/01(水) 11:34:20.64
型消去でSTL仕様のアロケータの型を消そうかと思ったんだけど
rebindできないことに気がついた。これって解決不能だよね?

class hoge{
vector<fuga, type_erased_alloc> v;
template <class A> hoge(A const &a) : v(a) {}
};

みたいな感じで使いたいんだけどどうにかならないかな
379 :
2011/06/01(水) 20:27:47.16
>>378
型消去の意味が解らんけど
aをvに複製するのであればアロケーターを置き換えることは可能。
380 :
2011/06/01(水) 20:29:12.86
>>377
実行時の値はどうでもいいんだからそれ意味なくね。
381 :
2011/06/01(水) 23:31:56.08
>380
2回目のTag2の定義でエラーになるということがポイント。
こうすることで、この名前空間におけるTag2の唯一性を検証できる。


>378
type erasureは型情報をplaceholderの外には出せない……と思う。
使うときに明示的に変換するか、マルチディスパッチするメソッドを用意する(>202)しかないんじゃない?

単に格納するだけだったらboost::shared_ptr<boost::any>の方が簡単だと思う。
382 :
2011/06/02(木) 00:42:44.07
>>381
いや、話の流れからすると>>373の悩みは、struct Xやstruct Argsを
シンボル名代わりに使ってみたけど、あとからenum Argsとか定義する事になったら
struct Argsが衝突しちゃうじゃん、他の宣言と干渉しない手っ取り早い
シンボルって作れないの?って事だと思う。
383 :
2011/06/02(木) 08:47:52.63
型消去の意味が分からない人は型消去かtype erasureでぐぐっといた方がよさげ
(この界隈限定で)割とメジャーな言葉だと思うし
384 :
2011/06/02(木) 20:19:53.79
>>383
1.delegateの仕組み
2.genericsのように入り口と出口だけ型を制限し、
Objectの中ではvoid*のような極端な抽象型を使う仕組み

どっちでも無いようにみえるけど具体的に何なん?
385 :
2011/06/02(木) 21:53:36.58
>384
2の逆。
placeholderの中では具体的な型情報を持っているけど、placeholderを管理するholderは
型情報を持たない抽象型を扱う。
boost::anyが実装例。

>382
型の特殊化を併用すれば名前の浪費は防げるね。
386 :
2011/06/02(木) 22:14:20.20
>>385
Delegate<Child(int,int,int)> method[]=
{
  &functor,          //Child operator(int,int,int);を定義しているオブジェクト
  &function,         //Child function(int,int,int); 普通の関数
  Type(),             //Child(int,int,int);コンストラクター Typeは空のクラス
   Delegate<Child(int,int,int)>(&object,&Class::Method) //オブジェクトと関数のペア
};

だからこういうヤツでしょ。
この例だと内部でvirtual Child operator(int,int,int)を定義したオブジェクトで個々の型をラップしてある。

しかし、>>378が何をしたいのか解らん。まずtype_erased_allocが自作のクラスなのか
hogeの外で定義されたテンプレート引数なのか。そもそもアロケータの型を消すってのも
何を指してるのか解らんし。
387 :
2011/06/02(木) 22:16:18.45
>>385
特殊化でっていうのは>>369のヤツのようなこと?
388 :
2011/06/02(木) 22:44:09.90
>386
boost::any見ろって。
boost::anyにはどの型のオブジェクトでも保存できるけど、boost::anyには
保存している型の(静的な)情報が含まれない。
>386 はAdapterパターン?
389 :
2011/06/02(木) 22:47:54.96
>387
いや、こんなの。

template<int i> class Tag;
template<> Tag<0> : public CellTagBase<Tag<0> > {};
// template<> Tag<0> : public CellTagBase<Tag<0> > {}; --> error
390 :
2011/06/02(木) 23:08:44.21
>>388
http://d.hatena.ne.jp/anonymouse_user/20110109/1294590115
こっからパクってきた。見れば解るがAdapterを内部で生成してる。
これをAdapterパターンというのかは知らん。

boost::anyには静的な情報が含まれないってのはテンプレート引数に
実体の型情報が無いって事だろ。
391 :
2011/06/02(木) 23:17:07.27
>>389
ああ>>377のコードを対象にレスしてたのね。
392 :
2011/06/03(金) 00:00:36.40
template <class T> struct type_erased_alloc
{
struct holder_ { virtual ~holder(){}; virtual void *allocate(size_t s) = 0; /*その他のメンバ*/ };

template <class A> holder : holder_ {
typename A::template rebind<T>::other a;
holder(A const & a) : a(a) {}
void *allocate(size_t s) { a.allocate(s); }
/*その他のメンバ*/
};

template <class U> struct rebind
{
typedef type_eraseed_alloc<U> other;
};

holder_ *p;

template <class A> Hoge(A const & a) : p(new holder<A>(a)) {}

template <class U> Hoge(Hoge<U> const & other) ; // これが書けない
};

こんな感じでrebindができなくなってしまう。やっぱ無理か
コンパイル切るためにクラステンプレートからテンプレートコンストラクタにしたいんだが・・・
393 :
2011/06/03(金) 00:43:22.84
>>392
変な所が多すぎてどう問題をとらえていいか解らん。

1.Hogeってtype_erased_allocのコンストラクター?
2.type_erased_alloc自体にallocateが要るんじゃないの?
3.holder_ *pはどこで使われるの?
4.これが書けないっていうのは、関数の宣言の部分が書けないの?
それとも関数本体の内容の書き方がわからないの?
5.宣言の問題だとしたら、type_erased_allocのTがUで取れないって事?
6.どうでもいいけどtemplate<class A>のあとのclassが抜けてね?
394 :
2011/06/03(金) 02:26:15.01
>392
そりゃムリじゃね? テンプレートコンストラクタが受け取った型情報はあくまで関数内に閉じ込められたものだし。
Aの情報はholderに閉じ込められるからtype erasureとしての価値があるわけで、Hogeに残っていたら
意味ないだろ。まあ、ソースコードが良く判らんから何とも言えんが。
395 :
2011/06/03(金) 02:28:45.10
単にコピーコンストラクタを書きたいのなら、boost::anyのcloneあたりの実装を参考にするのが良いと思う。
あるいは型に依存した色々な処理を行いたいのなら、動的なマルチディスパッチしか無いですな。
そっちは>202参考

というか素直にvector<boost::shared_ptr<boost::any> > 使え。
396 :
デフォルトの名無しさん
2011/06/03(金) 20:44:02.27
>>392
コードが足りなすぎてよくわからんけど、holder_を外にだせばいいだけじゃないの?
あともう一つ、コピコンで受け取ったHoge<U>をさらにholderで包むこともできんじゃないの?
ともかく正確なコードを書いてもらわんと解らん。ただし別にallocatorの規格で決まってる部分は
書かなくていいよ。手を加えたとこだけ見せてくれ。
397 :
2011/06/12(日) 18:51:32.30
::type



これウザくない?
結果が組み込み型とかになるならまだしもさ
継承とかできるならして::type書かなくていいようにすればいいじゃん
なんでみんなこんなだるい書き方するの?
398 :
2011/06/12(日) 18:56:14.99
>>397
まずはお手本よろしく。
399 :
2011/06/12(日) 19:33:35.74
>>373 みたいに、最後で評価するようにすればいいだろ。
まぁ、それでも1回は必要になるだろうけど。
400 :
2011/06/12(日) 21:42:21.21
>>397
ちなみにそれは0xになっても型の遅延評価として残り続ける。
401 :
2011/06/13(月) 08:23:29.69
>>387
テンプレートエイリアスを使え

template < typename T > using add_ptr = typename std::add_pointer<T>::type ;
add_ptr<int> ptr ; // int *
402 :
2011/06/13(月) 21:14:52.66
今無いものを言われてもねぇ。
VC6,0の悲劇を繰り返す気かい。
403 :
2011/06/15(水) 23:33:55.05
そこでマクロですよ
404 :
2011/07/06(水) 09:23:09.35
これ ; デリミタっていうんだけどさ、これをつけなきゃエラーになるような
そんな言語使ってる奴ってどうみてもゴミだと思うんだけど

もしかして「;」これ打ち忘れてコンパイルエラー出すのが楽しいの?
そうか、二度と話かけんなよ

結局ただのゴミだったんだな
405 :
2011/07/06(水) 12:12:15.53
数学板で猫が暴れているのと同じように、この天使というコテもそのポジションになりうるのだろうか。
406 :
2011/07/06(水) 21:01:18.67
こんなクソみたいな発言しているんじゃダメだろ。
407 :
2011/07/06(水) 21:09:15.88
猫もクソみたいな発言しかしないよ。
408 :
2011/07/13(水) 06:20:07.21
猫のクソみたいな発言しかしないよ。
409 :
デフォルトの名無しさん
2011/09/08(木) 16:50:30.76
下のプログラムは、MinGW (gcc4.5.2)では一応、正しい結果がでますが、VC++2008(SP1)では
次のコンパイルエラーが出ます。VC++2008の問題なのか、それともプログラムに問題ありなの
か教えて下さい。お願いします。

error C2593: 'operator +' があいまいです。
'std::complex<double> operator +<double>(std::complex<double>,double)' の可能性があります。
または 'std::complex<double> std::operator +<double>(const std::complex<double> &,const double &)'
[引数依存の照合を使用して検出しました] の可能性があります
   ↓
410 :
デフォルトの名無しさん
2011/09/08(木) 16:50:55.54

template <class T>
struct double_trait {
typedef T type;
};

template<>
struct double_trait<int> {
typedef double type;
};

template<>
struct double_trait<float> {
typedef double type;
};

template <class T>
std::complex<T> operator + (std::complex<T> z, typename double_trait<T>::type c)
{
return z+c;
}

int main()
{
using namespace std;

complex<double> z(0,1);
cout<< z+1 <<endl;
...
}
411 :
デフォルトの名無しさん
2011/09/08(木) 18:20:40.43
型がdoubleのときにVC++2008付属のSTL(Dinkumware)の中で

complex<double> operator+(complex<double>, double)

に相当するものが既に定義されていて、テンプレートパラメータT=double
のときに実質、2重に定義されてしまうんですかねぇ。
でも、gccのSTL(SGI)ではなぜエラーにならないんだろう?

まあ、Z+1の代わりにz+1.0とすればいいだけの話なんですが。
412 :
2011/09/09(金) 00:43:28.64
VCのバグ
413 :
409
2011/09/09(金) 15:04:05.19
普通の演算子オーバーロードにすると、gccもVC++も動きました。
complex<float> zのサイズが8でもz+1のサイズは16になっているのが
謎ですが、これは<complex>内でコンストラクタテンプレートが用いら
れているからでしょうか?

#include "stdafx.h"
#include <complex>

std::complex<double> operator + (std::complex<double> z, int c)
{
return z + (double)c;
}

int main()
{
using namespace std;

complex<float> z(0,1);
char c=1;

cout<<sizeof(z)<<endl;
cout<<sizeof(z+1)<<' '<<z+1<<endl;

int i; cin>>i;
return 0;
}
結果
8
16 (1,1)
414 :
デフォルトの名無しさん
2011/09/09(金) 15:07:04.11
訂正:z+1→z+c
415 :
2011/09/09(金) 20:14:14.66
お前がcomplex<double>を返してるから
416 :
デフォルトの名無しさん
2011/09/09(金) 21:38:45.81
そうだが、その前にcomplex<float>からcomplex<double>に変換する
コピーコンストラクタがないと、コンパイルエラーが出るはずなのに
なんで出ないのか? と言うのが本当の質問の意味だが。
417 :
2011/09/09(金) 22:22:05.58
規格読んでるのかい?
0xdraft 26.4.3
template<> class complex<double> {
public:
typedef double value_type;

constexpr complex(double re = 0.0, double im = 0.0);
constexpr complex(const complex<float>&);
explicit constexpr complex(const complex<long double>&);
418 :
デフォルトの名無しさん
2011/09/10(土) 08:40:12.02
ふーん、constexprは次世代C++に正式に導入さっるのか?
また、複雑さを持ち込んでいるような。

そもそも、ちょっと前のgccやVC++2008に導入されてるのか?
419 :
2011/09/10(土) 09:48:17.16
ISO/IEC 14882:2003 26.2.3
template<> class complex<double> {
public:
typedef double value_type;
complex(double re = 0.0, double im = 0.0);
complex(const complex<float>&);
explicit complex(const complex<long double>&);

つーかもうTMP関係ないだろ
0xスレなり初心者スレなりにいけ
420 :
デフォルトの名無しさん
2011/09/10(土) 10:20:47.29
complex<double> と complex<float>は別のクラスだから
型変換するためにコピーコンストラクタが必要だと思った
が、クラステンプレートを実体化した後なら普通のコピー
コンストラクタでokということか。

421 :
2011/09/10(土) 11:07:26.16
用語は正しく理解し使え。
話題にしてるのはコピーコンストラクタでなく
complex<float>からcomplex<double>への(暗黙の変換も可能な)変換コンストラクタ。
流れで通じてるからってそれに甘えるな。
422 :
2011/09/10(土) 11:15:16.79
変換コンストラクターと変わらないのに、
あえてコピーコンストラクターと特別な呼び方するのってなんでだろ。
コピコン未定義だと暗黙の代入されるけどあれはしょせんC互換のコピーだし
コンストラクター書くときに、変換コンストラクターとコピコンの区別を意識した事がない。
423 :
デフォルトの名無しさん
2011/09/10(土) 11:45:21.23
>>421

うぜぇ。カス!重箱の隅つついた事しかいえんのか?
424 :
2011/09/10(土) 11:52:17.58
>>422
explicitを指定しないコンストラクターはすべて、変換コンストラクターである。
コピーコンストラクターも変換コンストラクター。
コピーコンストラクターを定義するのは、それが特別な定義を必要としているから。
例えば、ユーザー定義のコピーコンストラクターがあれば、暗黙のコピーコンストラクターは生成されないなど。
425 :
2011/09/10(土) 12:00:08.50
>>423
>>418にも突っ込んどいたら。仕様に対する個人の感想なんかいらんわ、聞きたいことだけ聞け。カス!って
426 :
2011/09/10(土) 12:32:04.98
コピーコンストラクタと変換コンストラクタを区別してない人って多いのか?
自分でクラスを書くときには単に必要なメンバ関数の一つという意味で区別する意識はなくてもいいけど
他人と話すときははっきり区別しないと言いたいことが正しく伝わらないんじゃないか?
427 :
2011/09/10(土) 14:59:14.90
多いわけない。
コピーコンストラクタがなんであるか知らない奴なんて初級ちゃん。
428 :
デフォルトの名無しさん
2011/09/10(土) 15:29:52.94
やれやれ、ゴミ共がすぐ湧いてくる。



429 :
2011/09/10(土) 16:03:56.07
>>1-428
よう、ゴミ共
430 :
デフォルトの名無しさん
2011/09/10(土) 17:32:39.75
これで、このスレは、しばらく過疎化します。

しかし、何でこのスレというか、C++スレには「俺は何でも知ってるぞ!」
と自己主張すぎる奴が多いのかね。若気のいたりかw

規格書を読め? お前はパリサイ人か! こいつ、天狗になって職場とか
掲示板でも嫌われてるだろ。

VC++ラウンジにもそういう奴いるし。

C++の固有の決まりなんて知るか!だから、C++が嫌われるんだ。糞が

431 :
2011/09/11(日) 19:31:28.57
>>424
いや変換コンストラクターの一種であるコピコンが存在する事がおかしいとは言ってないよ。
わざわざ同じクラスに変換する変換コンストラクターを、わざわざなんでコピコンって呼ぶのってのが疑問なんで。
432 :
2011/09/11(日) 19:33:49.56
>>427
変換コンストラクタとコピーコンストラクタの違いって何?
「暗黙で生成される」と「クラスと同じ型を引数にとる」以外で。
433 :
2011/09/11(日) 20:25:44.37
explicit指定がなくて引数をとるやつが変換コンストラクタ
非テンプレートで第1引数が自分と同じ型で第2引数以降がないか省略可能なやつがコピーコンストラクタ

コピーコンストラクタは変換コンストラクタの一種ってわけじゃなく別の概念
434 :
2011/09/11(日) 20:35:28.49
>>433
よくわからん。

int a;
string b;
Numeric n,m;
n = static_cast<Numeric>(a); //変換コンストラクタ
n = static_cast<Numeric>(b); //変換コンストラクタ
n = static_cast<Numeric>(m); //コピコン

n = Numeric(a); //変換コンストラクタ
n = Numeric(b); //変換コンストラクタ
n = Numeric(m); //コピコン

n = a; //変換コンストラクタ
n = b; //変換コンストラクタ
n = m; //コピコン

n = Numeric( "100", 8 ); // 通常コンストラクタ
435 :
デフォルトの名無しさん
2011/09/18(日) 15:34:34.38
何らかの型Tがあって、その型は組み込み型か組み込み型への変換演算子を持っていると期待出来る。
最終的には型をlong, unsigned long, doubleのいずれかに変換したい。
というときに、型Tを最も適当に変換出来る型を取得するにはどうしたらいいだろうか?

template<typename T>
struct ConvertResult { typedef ??? type; };
template<typename T>
typename ConvertResult<T>::type convert(T t);

struct X { operator int(); }; // intへ変換可能

long n = convert(X()); // longになって欲しい
436 :
2011/09/18(日) 16:02:28.92
>>435
まず「最も適当」を定義してもらう必要があるんじゃなかろうか。
437 :
2011/09/18(日) 17:00:11.98
>>436
元が組み込み型と変換不能な型は場合わけが出来るので問題ない。
浮動小数点数に変換出来る型は符号の有無が無いので多重定義で分類出来る。
整数型に変換出来る型だと整数の昇格があるので縮小変換と拡大変換が
同格になるのが問題だった。
http://codepad.org/sGDXhSYH
http://codepad.org/xhR2bnXx
438 :
デフォルトの名無しさん
2011/09/18(日) 21:41:25.13
>>433

別にどうでもいいやん。

Aクラスから全く別のクラスBに変換するのならあってもいいが。
しかし、そんな状況はクラス設計が終わっとる

ただ、単にintからlongに変えるだけで値は変わらんでしょ。
暗黙の型変換演算子か、コンストラクタテンプレートをもっただけでしょ。

やたらと新しい概念を持ち込む「禿ども」、そしてそれを有り難がってる
「日本の馬鹿達」がうざい。
439 :
2011/09/18(日) 21:56:01.39
>>435
ConvertResult::operator long();
ConvertResult::operator unsigned long();
ConvertResult::operator double();
ConvertResult::type使わずこういう使えばいいんじゃね。
440 :
2011/09/19(月) 14:55:31.66
魔法の呪文
#if __cplusplus >= 201103L
を打ちまくって気分だけでもC++2011を味わえばいい
#else
の妥協部分にも妙案が出てくるかもしれんし
441 :
2011/09/23(金) 03:02:38.76
>>438
外国はどうよ。日本よりはましか?
442 :
2011/10/12(水) 23:52:30.41
http://codepad.org/VbGFMpCW
templateで与えられた構造体のサイズを最小にしたくて頑張ってるんだけど
上のコードのFoo0〜Foo5を自動で生成することはできないかな?
今は構造体ごとにスクリプトで生成してるんだけどC++だけでできるなら(マクロなしで)教えて欲しい
変数名がでたらめならできるんだけどtemplateパラメータの順番と変数名のマッピングが崩れないようにしようとすると詰まった
443 :
2011/10/13(木) 00:34:14.96
template<typename A,typename B,typename C>struct small{
template<typename E,typename F,typename G>struct asmb_t{E x0;F x1;G x2;};
template<typename E,typename F,bool G=sizeof(E)<=sizeof(F)>struct cmp_t{typedef E t;};
template<typename E,typename F>struct cmp_t<E,F,false>{typedef F t;};
typedef asmb_t<A,B,C> v0;
typedef asmb_t<A,C,B> v1;
typedef asmb_t<B,A,C> v2;
typedef asmb_t<B,C,A> v3;
typedef asmb_t<C,A,B> v4;
typedef asmb_t<C,B,A> v5;
typedef typename cmp_t<v0,typename cmp_t<v1,typename cmp_t<v2,typename cmp_t<v3,typename cmp_t<v4,v5>::t>::t>::t>::t>::t type; };
444 :
2011/10/13(木) 00:37:22.55
あ、ごめ要点全然外れてたw
445 :
2011/10/26(水) 02:56:03.92
こういうコードの様に特殊化と実体の無いテンプレートを駆使してみたら?
http://codepad.org/Voh18mFU
446 :
2011/11/14(月) 08:49:41.89
カウンタを定数で回すforがほしいんだけど、TMPでできませんか?

template<int i> struct func{
void operator()(){
//カウンタが定数なので配列の長さや他のtemplate引数に使える
int a[i]; sprintf_s<i>(a, "%d", 12345);
}
};
static const int start = 0, end = 3;
static_for<start, end, func>();



{func<0> f; f();}
{func<1> f; f();}
{func<2> f; f();}

に展開するようなイメージ。
447 :
2011/11/14(月) 09:19:14.46
本題と違うところにツッコミだけど、 sprintf_s は黙って結果を切り捨てたりしないぞ。
448 :
2011/11/14(月) 10:34:18.62
template <int i, int j, class F> class For {
F f;
public:
For(F f) : f(f) { }
void operator () (void) const {
f();
For<i + 1, j, F> g(f);
g();
}
};

template <int i, class F> class For<i, i, F> {
F f;
public:
For(F f) : f(f) { }
void operator () (void) const { }
};

class F { public: void operator () (void) const { std::cout << "Hello" << std::endl; } };

int main(void) {
F f;
For<0, 2, F> g(f); // [0, 2)
g();
return 0;
}

こんなん?
449 :
2011/11/14(月) 16:39:03.77
>>447 ランタイムエラーでしたっけ。
数値のテンプレート引数を渡すものがぱっと思い浮かばなかったのでこれにしました。

>>448 ありがとうございます。
なるほど、こういう再起を作ればいいのか。
慣れてしまえば単純なんだろうけど、どうしても再起が直感的にわからなくて。
カウンタ定数を関数に渡したいので、ちょっと改造させてもらいました。
450 :
2011/11/14(月) 16:39:33.78
template <int i, int j, template<int> class F> class For{
F<i> f;
public:
void operator () (void) const {
f();
For<i + 1, j, F> g;
g();
}
};

template <int i, template<int> class F> class For<i, i, F> {
F<i> f;
public:
void operator () (void) const { }
};

template<int i>
class F{
public:
void operator () (void) const {
char a[i]; sprintf_s<i>(a, "%d", i);
}
};

int main(){
For<2, 5, F> g; //[2, 5)
g();
return 0;
}
451 :
2011/11/14(月) 17:04:27.39
あとは関数オブジェクトじゃなくてラムダ関数が渡せれば最高なんだけど
templateラムダ関数なんてないしなぁ…
452 :
デフォルトの名無しさん
2012/01/12(木) 00:51:25.53
struct なにかの名前_tag {};
なんて感じの使い方の共通パターンどこかにまとめられてないでしょうか
boost.MPL?
453 :
2012/01/12(木) 01:26:08.30
>>451
boost::spirit?
454 :
2012/01/15(日) 20:40:58.27
コンパイル時のクラス識別子整数的な目的で
コンパイル時ユニークIDが欲しいのだけど可能ですか?
455 :
2012/01/16(月) 00:03:31.97
このスレをよく読むといいよ
456 :
2012/02/03(金) 11:41:10.62
template<typename T> struct test{
typedef T t;
};
template<typename T>
void hoge(typename test<T>::t v){}
template<typename T>
void moge(decltype(T()) v){}
hoge(0);
moge(0);
こういう関数の引数の型をなんとか自動的に特定する方法はありませんか?
457 :
2012/02/04(土) 14:46:33.15
for(int i = 0 ; i != 10 ; ++i) { a[i] = i ; }

これを

a[0] = 0 ;
a[1] = 1 ;
// ry
a[8] = 8 ;
a[9] = 9 ;

に展開したいのだけど、どう書くと実現できますか?
458 :
2012/02/05(日) 01:35:27.20
>>457
初めて書いてみた。こんな感じ?
ttp://ideone.com/KmgKr
459 :
2012/02/14(火) 15:58:09.47
>>456
「自動的に特定」とは?
460 :
2012/02/15(水) 09:14:33.77
テンプレート引数の減少というのでしょうか。
template<typename T>
void hoge(typename remove_const<T>::type &v){}
461 :
2012/02/15(水) 15:51:25.50
2つの型のテンプレートが同じか判別するクラスを作成しています。

template<typename T, typename U>
struct template_is_same{
static const bool value = false;
};

template<
template<typename> class T,
typename T0,
template<typename> class U,
typename U0
>
struct template_is_same<T<T0>, U<U0>>
: is_same<T<T0>, U<T0>>{}; //is_same<T, U>::valueは同じ型かどうかを表す

引数の数を増やせばある程度対応できると思ったのですが、、
462 :
2012/02/15(水) 15:52:06.37
typenameではなく、整数などの引数を取るテンプレートの場合、どう書けば良いですか?

template<
typename A0,
template<A0> class T,
A0 t0,
template<A0> class U,
A0 u0
>
struct template_is_same<T<t0>, U<u0>>
: lib3::is_same<T<t0>, U<t0>>{};

こう書くと、A0が推定できないと出ました。
463 :
2012/02/21(火) 23:46:53.73
template<
typename A0,
template<A0> class T,
A0 t0,
template<A0> class U,
A0 u0
>
---------------------
template<
typename A0,
template<class> class T,
A0 t0,
template<class> class U,
A0 u0
>
464 :
2012/02/22(水) 01:05:19.67
template <int N> struct Factorial {
enum { value = N * Factorial<N - 1>::value };
};
template <> struct Factorial<0> {
enum { value = 1 };
};
465 :
2012/02/23(木) 15:35:14.66
自作のコンテナがSTLの要件を満たしているかどうか確かめるメタ関数ってないんですか!?
466 :
2012/02/23(木) 15:54:55.91
libstdc++にtestsuitsが付いてるから、
チョチョイと改変して使ってみたら?
467 :
デフォルトの名無しさん
2012/10/02(火) 20:48:07.55
std::vector<std::string>またはstd::list<std::string>を返すテンプレート関数を定義したい。
std::stringはそのまま使いたいので
template<typename T> T <std::string> func(std::string s)
{
T<std::string> ret;
ret.push_back(s);
return ret;
}
とやったら
t.cpp(3) : error C2988: unrecognizable template declaration/definition
t.cpp(3) : error C2059: syntax error : '<'
というエラー, さてどう書けばよいでしょう?
std::vector<std::string>全部をテンプレート引数にして↓
template<typename T> T func(std::string s)
{
}

template<typename T> T func(typename T::value_type s)
{
}
がOKなのは知っていますが、関数の引数,コンテナの値タイプはstd::stringに限定したい。
468 :
2012/10/02(火) 21:09:55.73
template<typename<typename> T>
T<string> func(string);
469 :
2012/10/02(火) 21:18:22.97
function<R(T)>がT &&でなくTを引数にする理由は?
470 :
2012/10/02(火) 21:19:51.22
じゃなくてアルゴリズムがfunc(Iterator, Iterator, Pred)のようにPred &&でなくPredを引数にするのはなんで?
471 :
2012/10/02(火) 21:34:05.43
>>468
t.cpp(4) : error C2947: expecting '>' to terminate template-parameter-list, found '<'
t.cpp(4) : error C2988: unrecognizable template declaration/definition
t.cpp(4) : error C2059: syntax error : '>'

>>470
それはコピペ間違いだけど、本質的じゃないです。これでも同じ。
template<typename T> T<std::string> func(std::string &s)
{
T<std::string> ret;
ret.push_back(s);
return ret;
}
472 :
2012/10/02(火) 21:58:20.06
template <template <typename...> class T> T<std::string> func(std::string s)
473 :
2012/10/02(火) 22:03:31.01
できた
ttp://ideone.com/VgdsG
474 :
2012/10/03(水) 07:39:03.33
>>473
おお、すげー
typename Container
じゃダメで
class Container
じゃなきゃダメらしい。classをtypenameで置き換えられないケースって初めて知った。

PS.
typoして気づいたけどVS2010は↓でも通りますね。(>>)
typename alloc = std::allocator<T>>
475 :
2012/10/03(水) 13:04:00.50
VC++のバグ
476 :
2012/10/03(水) 13:18:45.29
山括弧連続はC++11でokになった。
http://ja.wikipedia.org/wiki/C%2B%2B11#.E5.B1.B1.E6.8B.AC.E5.BC.A7

VC++は2005の頃からいけた気もするけど。
477 :
2012/10/03(水) 14:42:04.96
連続で書いちゃうとシフト演算子と誤認するバグだっけか
478 :
2012/10/03(水) 16:59:56.86
テンプレート構文後付けで追加したときに構文ルールを変更しなかった制限。
バグと言えばバグだけど。
479 :
デフォルトの名無しさん
2012/10/03(水) 18:06:14.97
構文の問題じゃねえぞ
字句解析の仕様の問題だ
480 :
2012/10/03(水) 19:52:47.07
構文ルールを変更しないと対応できないから残ってたんじゃん。
481 :
デフォルトの名無しさん
2012/10/03(水) 21:44:00.17
>>480
字句ルールだろ?
482 :
2012/10/03(水) 22:26:34.01
字句ルールと思ってればいいよ
483 :
2012/10/04(木) 20:22:56.71
寒い
484 :
2012/10/04(木) 22:39:53.89
>>482
2.12 Operators and punctuators
The lexical representation of C++ programs includes a number of preprocessing
tokens which are used in the syntax of the preprocessor or are converted into
tokens for operators and punctuattos'
preprocfessing-op-or-punc: one of
略 >> 略
だろ?

だから文法だけ直しても駄目なわけ。
485 :
2012/10/05(金) 01:03:03.35
字句ルールと思ってればいいよ
486 :
デフォルトの名無しさん
2012/10/05(金) 01:33:25.61
まあまあそういわず
487 :
2012/10/08(月) 18:07:45.15
(それが正しいんだから、)字句ルールと思ってればいいよ(。そうすべき。)
488 :
2012/10/08(月) 23:17:22.24
ネストした template-parameter-list を >> で終わらせられるような文法を書けばいいのでは〜
489 :
2012/10/11(木) 02:00:22.81
>476 にあるように、もう C++11 では字句ルールが修正された。
490 :
2012/10/11(木) 22:38:32.99
質問スレかどうか悩んだんですがメタプロな気がするのでこちらに書きます。
C++のテンプレートを使えば型や基本型の値を抽象化したクラス等が作れますが、
「変数名」を抽象化する方法ってありますか?

例)
template<typename T>
void func(T hoge){std::cout<<hoge<<std::endl;}

の「hoge」という変数名まで抽象化できたらなーと思ったのですが。
491 :
2012/10/11(木) 23:12:01.35
マクロ(プリプロセッサ)

そもそもすでに仮引数名そのものが呼び出し時に渡される実引数を抽象化したものになっているんだが
492 :
2012/10/12(金) 00:00:58.33
すでに抽象化された仮引数の何をさらに抽象化したいのやら
493 :
2012/10/12(金) 00:06:30.05
質問は具体的に。
494 :
2013/06/09(日) 10:34:54.51
最近C#始めて、C++との違いに戸惑っているのですが、
C++の変態的なTemplate Meta Programingから
C#のGeneric? Meta Programingへの置き換えを
扱っているようなサイトはありませんんか?
495 :
2013/06/09(日) 12:26:11.97
そもそもTemplateとGenericは似て非なるものなので
置き換えようとすること自体無理があります
496 :
2013/06/10(月) 12:29:47.11
全部置換えられるとは思っていません。
出来ないなら出来ないと分れば良いです。
497 :
2014/02/11(火) 10:33:57.07
SFINAEが理解できん…
498 :
2014/02/12(水) 11:51:45.31
どのレベルでの理解できんだよ?
テンプレートの基本を正しく理解できているなら
SFINAEも基本は単純で特別なところは無いうえにあって当然のごく自然な処理だからたやすく理解できるぞ
応用になると話は変わるが基本を正しく理解できていれば一歩ずつ理解していけるだろ
499 :
2014/02/20(木) 18:38:49.58
SFINAEでできること全部、言語レベルでやって欲しい
500 :
2014/02/25(火) 01:01:58.22
オーバーロード
テンプレートの特殊化
SFINAE

どれも、○○に適合するかしないか、で振り分けか・・・
501 :
2014/05/24(土) 02:21:45.76 ID:zaww/3E4
テンプレートメタプログラミングは最近勉強し始めたんですが
これって機能の実装中に考えるものではなくて、
一通り実装し終えてから高速化するために考えるものって解釈でいいんでしょうか?
実装しながら考えるとマジで呪文書いてるみたいに思えてわけわかんなくなるんですが
502 :
2014/05/27(火) 12:26:09.18 ID:D6t3bmO9
オレオレライブラリを作ってみると良いよ
アプリを作りながら覚えるようなものではないと思う
503 :
2014/08/04(月) 01:25:36.54 ID:380FSYFH
テンプレートメタプログラミングはプログラマブルマクロですか?
504 :
2014/08/08(金) 10:40:48.66 ID:la99q2hi
擬似関数言語と言われているようです。
505 :
2014/10/11(土) 15:22:54.39 ID:BtCnKocW
constexprを使うとだいぶ楽になる
再帰は免れないけど
506 :
2014/10/17(金) 00:45:58.06 ID:Hi4Jootu
constexprだと最適化で再帰が平文化されて深度気にしなくていいって聞いたことあるんだけど本当?
507 :
2014/10/17(金) 02:10:59.46 ID:cTCCghlL
んなわきゃない
再帰->ループの最適化が可能ならconstexprとは関係なくされるし
ループに変換できないならコンパイル時計算であっても再帰で処理されるから限界はある
508 :
2014/10/18(土) 09:29:03.19 ID:tA+rY70l
実行時に再帰の深さでスタックオーバーフローになることがない、という質問ならその通り。
509 :
2014/10/18(土) 17:22:23.43 ID:V1Tek8sR
>>507-508
ありがとう、すっきりした
510 :
2015/03/02(月) 23:56:25.01 ID:1xZgmfYC
C#のようにダイナミックなメタプログラミングも面白いと思うんだがC++じゃ難しいかな
メタ属性の自動生成的なTMPテクニックは無いものか
511 :
2015/03/03(火) 08:45:07.32 ID:7SMPCxJs
そういうライブラリ書いて使えば。
512 :
2015/03/16(月) 00:43:32.44 ID:oGjevCAQ
メタプログラミングってのを勉強しはじめたんですが、

template<int value1, int value2>
struct Add
{
enum { result = value1 + value2 };
};
std::cout << Add<2, 3>::result << std::endl;

で、5と出力されますが、
int i = 2;
std::cout << Add<i, 3>::result << std::endl;

だとコンパイルできません。
コンパイル時に定数しか受け付けないんだとしたらなんの意味があるの?

std::cout << 5 << std::endl;
って書いているのと同じですよね
513 :
2015/03/18(水) 22:31:40.63 ID:LJL5ftmA
メタプログラミングなんてコンパイル時に決定していなければならないのでほとんどの場合使い物になりません。
2つの数字を足してますが、コンパイル時に2数は2と3で無ければいけません。
ユーザに入力してもらう場合は使えないので、実用性はありませんよ
514 :
2015/03/18(水) 22:54:42.95 ID:Zu9d/Gpg
ダイナミックなメタプログラミングのが便利だよな
515 :
2015/03/18(水) 23:26:06.70 ID:9CBewuhX
テンプレートメタプログラミングは、コンパイル時に「型」を計算させるもの
516 :
2015/03/18(水) 23:34:14.57 ID:LJL5ftmA
型なんて計算しなくても決定してるじゃんw
517 :
2015/03/19(木) 00:05:57.78 ID:V7Lax8Bn
.NETのジェネリックがバランスいい
518 :
2015/03/21(土) 22:45:18.22 ID:7+ji4sYH
マクロとテンプレート関数について教えてください
大きいほうを返却するマクロとテンプレート
#define OOKIINOHADOCCHIDAM(A,B) (A>=B?A:B)
template<typename T> T OOKIINOHADOCCHIDAT(T A,T B){return A>=B?A:B;}

int ookiihou;
ookiihou = OOKIINOHADOCCHIDAM(1,2);
ookiihou = OOKIINOHADOCCHIDAT(1,2);

とした場合
絶対にinlineで展開されるという保障が無いため、OOKIINOHADOCCHIDATは呼び出し分不利だと
思うのですがどうなんでしょうか?
519 :
2015/03/22(日) 16:00:44.78 ID:573iYXRM
パフォーマンスを気にするなら出力されたアセンブラを見て検討する。
最適化がどの程度かというのは処理系やバージョンによって違うから、TMPのスレで話すような話題ではない。
パフォーマンスとは別に、マクロと違って
OOKIINOHADOCCHIDAT(i++,--j)
とか
OOKIINOHADOCCHIDAT( 0 || 1, 2 )
とかやっても見えない副作用が無い。

ところでここはメタプログラミングのスレなんで、次からは初心者質問のスレで質問してね。誘導されてから個別のスレでね。
520 :
2015/03/22(日) 23:21:32.87 ID:ljCp5GrR
テンプレートなんてハッカーが作ったもの以外は使えないだろ
だいたい、どんな型でも良いようなことなんて実際のプログラムでひつようなことなんてほとんどない
設計時に決めてしまっているため、コンピュータサイエンスを研究している学者かハッカーくらいしか
自作することは無い
521 :
2015/03/23(月) 01:45:25.88 ID:1fiK6OPe
メタプログラミングに興味が出たらまた来てね。
522 :
2015/03/23(月) 12:50:41.60 ID:kZkGZazg
>>520
世の中には静的ポリモーフィズムと言う考え方もあるんだお。
523 :
2015/03/23(月) 22:22:13.71 ID:k4Iv9Yid
テンプレートはモジュール化出来ないから不便
524 :
2015/03/23(月) 22:35:24.46 ID:GCGYLNCS
モジュール化する理由は?
525 :
2015/03/23(月) 23:43:51.12 ID:1fiK6OPe
モジュール化は問題なくできるだろ。
モジュールとかパッケージに対する観念がカチカチの柔軟性のない頑固頭だからそういう話になる。

また、テンプレート一般の話なら C++ スレでやりたまえ。
背伸びしないで、メタプログラミングに興味が出てからまたきたまえ。
526 :
2015/03/24(火) 00:23:59.38 ID:mo5/BctE
背伸びして、メタボ?
イミフ
527 :
2015/03/24(火) 00:39:45.62 ID:SJvrs7Lk
めたpろはやり尽くした結果余計でレガシーな洗練されてないダサい技術と確信した
528 :
2015/03/24(火) 08:05:14.09 ID:PUWZ5d3i
TMPって略称は市民権得てますか?
529 :
2015/03/24(火) 08:08:40.57 ID:PUWZ5d3i
>>504
じゃあ関数型言語が当たり前にやってきたことを今更取り入れてるんですか? 遅れってる〜
530 :
2015/03/24(火) 20:28:20.19 ID:mo5/BctE
メタプログラミングってコンパイル時に定数でなきゃいけないんですよね?
よく例として階乗が出されるが
int n = factorial(3);
でしか使えないんですよね

それだったらコンパイル時に計算なんてせずに
int n = 6;
と書いてけば、コンパイル時間も短縮できるからなんの意味があるのかさっぱりわからん
531 :
2015/03/25(水) 00:14:10.62 ID:sC+pepL9
>>530
その「3」を、コンパイル時に自由に設定可能にしたい時、毎回結果を人間が計算するとかありえないだろ…
532 :
2015/03/25(水) 00:31:47.02 ID:1YXCDFuZ
プログラムから計算結果をコードにして吐き出す方が速くて柔軟で理解しやすいよ
TMPはゴミ
533 :
2015/03/25(水) 00:50:49.93 ID:KfwtEOZY
>>531
その「3」を、毎回人間がコンパイル時に変更するとかはありえるんですか?
3を編集しているなら、結果もそのまま編集してしまってもいいのでは?
534 :
2015/03/25(水) 01:43:20.22 ID:sC+pepL9
>>533
うーん、毎回計算したいなら、すればとしか言いようがない。
人間が計算するのはバグの元なのは周知の事実だと思うが、そこは理解してもらえない?
それから、コンパイル時に変更する値というのはかなりあるよ。
開発したことないのかな?
535 :
2015/03/25(水) 02:30:41.03 ID:OtL+LsbQ
>>530
コメントには 3! とか factorial(3) とか書くんだろ?
ならコードにそのまま書いてあるのが意図をスムーズに伝える読みやすいコードと言えるだろう。
そこでテンプレートを使うべきかどうかは別の問題だが、君の例はコンパイル時計算に拘る必要がないことを示す例としては不適切だ。
536 :
2015/03/26(木) 11:11:30.93 ID:GXztcScs
>>534
コンパイル時に変更するなら結果もいっしょに変更してしまえといってるだけ

人間が計算するのはバグの元なのは周知の事実であれば
int n = 1 + 2;

もNGですか?

int n = 3;
じゃだめですか?
537 :
2015/03/27(金) 00:48:21.76 ID:a/NfPwWW
>>536
めんどくさいなあ。
やりたきゃ自分で計算しても構わないよ。
一般論を言ってるだけで、別に強要してないんだから、好きにすればいいんじゃないかな。
538 :
2015/03/28(土) 09:00:56.00 ID:SDORTR7x
コイツみたいなのがバラまいたマジックナンバーだらけのコードは引き継ぎたくねぇな…。
539 :
2015/03/28(土) 09:05:21.23 ID:INa8PmT6
保守するやつなんかどうでも良いし
過酷な条件で下請けを虐める連中もどうでも良い
仕様を満たす中で最も保守性の悪いコードを書くよ
540 :
2015/03/28(土) 12:43:42.52 ID:Ruzh6H/h
>>538
int n = factorial(3);

の3はマジックナンバーなのでは?
541 :
2015/03/28(土) 20:26:34.07 ID:mK/cxwKs
>>540
それはマジックナンバーとは言わないかな。
意味がわかるから。
542 :
2015/03/28(土) 21:00:18.20 ID:Ruzh6H/h
int n = 6; // 3の階乗
とどう違うの?

こちらのほうがコンパイル時間が短い分だけよくね?
結果が分かっているものをコンパイル時に計算するって無駄ですよね
543 :
2015/03/28(土) 21:56:15.36 ID:V1hOllOl
meta factorial なんか例に挙げるから明後日の方向に話が進むんだよ
544 :
2015/03/28(土) 23:14:01.94 ID:Yd74aMwf
>>540
マジックナンバーだよ。できれば意味の分かりやすい名前付きの値にしたほうがいい。

>>542
"3" を変更しようとしたらその "6" とコメント中の "3" との両方を変えないといけなくなる。
少なくともその例ならコンパイル時間の差を人が認識できることはないレベルだろうから、
保守性を落とす(&変更に無駄な手間を必要とする)理由にはならない。
545 :
2015/03/28(土) 23:35:09.90 ID:Ruzh6H/h
コンパイル時に決定してるいることなんてほとんど無いでしょ?
たとえばテキストエディタで決まったファイルネームで且、中身の決まったものしか
読めないテキストエディタなんてだれが使うの?

開くファイルはコンパイル時には決定できませんよね
546 :
2015/03/28(土) 23:50:02.28 ID:m4j2ohKe
>>545
TMPでアプリケーション書こうとするから話がおかしくなるんだよ

enable_ifみたいに型を引数に取って、型を返すメタ関数があると、ライブラリ書くときにすげぇ便利なんだ
型はコンパイル時に決定されるものだからね
547 :
2015/03/29(日) 00:06:01.07 ID:GiWz43mQ
型計算しなきゃならない時点で設計ミスだからね
TMPに甘えないで設計力を身につけなさい
メタプログラミングは言語依存度高いから慣れきってしまうと他の言語を使う時に困るよ
548 :
2015/03/29(日) 00:10:58.25 ID:M18I0Bq+
型なんてそんなころころ変わる?
549 :
2015/03/29(日) 00:50:26.32 ID:YISrMA6X
不特定多数が利用するテンプレートライブラリの場合だと、
ライブラリの利用者ごとに違う型で使われる可能性があるから、
ライブラリ視点で見ると型がころころ変わるね
550 :
2015/03/29(日) 01:09:19.30 ID:XfQU9N1R
設計力(笑)
そんなやつがわざわざC++使っておいて無駄だらけの非効率的なコードを書くんだろうな
551 :
2015/03/29(日) 01:49:10.02 ID:M18I0Bq+
templateってstlやboostを作ってるようなハッカー達が書いたものなら安心して使えるが、
正直その辺の連中が書いたようなものなんて全く信用できなくね?

っていうか、会社では禁止されてる。
stlやboostは使用OK
552 :
2015/03/29(日) 01:51:54.80 ID:rnF3PLWy
Makefile使えばplain Cでできるじゃんよ
553 :
2015/03/29(日) 09:42:26.60 ID:foFOOypx
>>542
その通り、よく気づいたね!
君はスーパープログラマへの階段を登りつつある!
その調子でガンバレ!
554 :
2015/03/29(日) 10:10:31.27 ID:SE+Q5kVo
>>551
テンプレートは予測困難すぎて誰が書いたって信用出来ないよ
STLやBOOSTが信用される理由は利用者が多くて必然的によくテストされてるってだけ
555 :
2015/03/29(日) 17:12:30.32 ID:M18I0Bq+
利用者が多くてテストされてるから信用されるわけではない
信用されてるから利用者が多い
556 :
2015/03/29(日) 17:12:54.98 ID:M18I0Bq+
しよくテストされるってだけ
557 :
2015/03/29(日) 21:06:30.68 ID:A7/HaQrx
職場のレベルが低いとかの話はマ板で。
558 :
2015/03/30(月) 21:05:29.90 ID:Z/xNzUYF
コンパイル時に決定してることってあるの?
そういったプログラムだとATMなら決まった暗証番号で決まった金額しか入出金できないの?
559 :
2015/03/31(火) 11:25:50.97 ID:SR8IVGNS
初心者質問スレで聞いてくれ。
560 :
2015/04/03(金) 21:09:27.68 ID:6jSxnujl
TMPは要するにmake前に./configureしてるようなもんだろ
TMPでソースコードを自動生成して、直後にコンパイルするんだよ
感覚掴めた?
561 :
2015/04/03(金) 21:31:20.03 ID:Jz/BH8fu
メタプログラミングのメリットが感じられん
コンパイル時に決定していることなんてごく僅かじゃん
562 :
2015/04/03(金) 22:58:23.62 ID:9Ub7Yndn
>>561
その通り!
君はすごいなあ。
良くそこに気付いた!
563 :
2015/04/03(金) 23:16:46.72 ID:1fmbbdAS
コンパイル時しか使えないのはまだ許せるが実装手段が汚いのがなぁ
拡張して美しいメタプログラミングができるようにすればいいのに
564 :
2015/04/08(水) 23:35:19.71 ID:rJ1QxPv7
03コンパイラでdecltypeと同等の機能を実装する事は出来ないのかい?
関数合成とかしたいけど返り値の型計算が出来ない…
565 :
2015/04/15(水) 22:26:16.45 ID:MncDCMB0
テンプレート使えばできるよ
566 :
2015/05/17(日) 21:20:10.02 ID:hki7XweT
上級者がすなるTMPといふものを、俺もしてみむとてするなり
先ずはテンプレートテクニックとかいうのを買えばいいんだろう?
567 :
2015/05/17(日) 23:07:33.84 ID:z/t+/yPf
>>566
気になった本から読めばいいと思うが
『Modern C++ design』や
翔泳社の
『C++テンプレートメタプログラミング』
『C++テンプレート完全ガイド』
もあるでよ
568 :
2015/05/18(月) 00:38:25.36 ID:owFvwpuo
TMPは完全なお遊びだよ
まともな現場じゃ禁止されてるのが当たり前なぐらい保守とテストが難しい
そして設計がまともならそもそもTMPに出番はない
勉強する価値はないよ
569 :
2015/06/01(月) 20:13:46.23 ID:EdWu5WFj
そりゃそうだろ
どんな型でもいい状況が、あるわけがない
コーディングする前に、データ構造はすべて決定してるからな
570 :
2015/06/02(火) 12:01:40.09 ID:XuwdyuF/
……。
型以外全く同じコードが現れるのがそんなに珍しいか?
571 :
2015/06/02(火) 21:53:21.20 ID:76ch2Gai
あ、バカだ
572 :
2015/06/05(金) 14:46:38.01 ID:PPi1ASxW
そして設計がまともならそもそもTMPに出番はない

的を射てるな

どんな方でも入れるような大衆店なんて嫌だな
573 :
2015/07/28(火) 03:45:09.04 ID:RBpFIWq5
つまり設計をまともにすることが難しいんですね!
574 :
2015/10/07(水) 03:28:01.75 ID:VZ1ed0FI
話題ないんですか?
575 :
2015/10/08(木) 21:19:43.12 ID:WVmCtEXX
(スレが落ちることを気にして無理にレスする必要は)ないです
576 :
2015/10/23(金) 18:41:27.86 ID:QTSI3RkV
話題ないんですか?
577 :
2015/11/07(土) 19:21:52.86 ID:t6CLGU5E
>>570
比較的低いレイヤーのコード触る以外に必要ない。
そしてそういうものはお前の100倍頭のいい方々がすでに実装されているものがある。
578 :
2015/11/07(土) 22:12:06.33 ID:h8n1eFAC
クソ!趣味や楽しみの範疇を出ないじゃないか!
579 :
2016/01/07(木) 05:07:09.12 ID:GSZcF0Qy
話題ないんですか?
580 :
デフォルトの名無しさん
2016/03/29(火) 09:07:55.24 ID:/c8bAcK4
サッカーブッシュ日本代表日程ぷあたん(しゅっちょうまいくろ教育長交代)春文執行40代売上差額シュガーチョコ
https://www.youtube.com/watch?v=NDq1QoJY0nY宇ドナルドアナリストパワーストーンコーチングとしまえん
サッカーブッシュ日本代表日程古本屋よしたけしゅっちょうちょこしゅがー
ディーラー税務署天才開発者死亡詰みヨミドクターマイクロサービス不足
サッカーブッシュ日本代表日程ぷあたんシフト光金さかい強制バイト人権侵害問題
春分資源執行ニューヨーク低原価ぼったステーキソルトレイク福岡横浜新橋奴隷課金パチシフト強制バイト問題新潟米センター生残
コスメ24チャリティー隠れ40代生活保護プレイボーイバイトレードいたりあん接待問題
マスコミKARDローンケーオーサービス不足婚活パーティー寄付金執行原発ビジネス
FBIチャイニーズタイホテル売上事務所ガチャ決算ガチャキャンペーン(販売報道陣過激派組織向携帯最新情報提供終了
校長発言細心注意ノートン産廃エラー(著作権クレーム中国反応融資高額教育費)(中国捕鯨団体40代社員サッカーコメント
高額入学金ヤフウ新橋大学ヤフウ新橋理事長FX経費 おじや50代資産ガリバズフィード40代エリート
581 :
2016/04/24(日) 03:46:29.95 ID:PmTKsIVl
どんな型でも扱えることが必要になることなんてありますか?
設計が終わった時には、すべて型なんて決まってるからな
582 :
2016/04/24(日) 10:35:05.32 ID:IhUvQdoq
ライブラリにはだいたい必要だよ。
ライブラリの利用者がどんな型を必要とするかなんて、ライブラリの作者は知らないから。
583 :
デフォルトの名無しさん
2016/04/24(日) 14:06:44.93 ID:Inhm7+j0
>>581
型以外全く同じコードを沢山書きたいなら俺らは止めたりしないよ。
584 :
2016/04/24(日) 15:31:01.95 ID:cfBCsOMn
>>583
なんのデメリットがあるの?
585 :
2016/04/25(月) 01:41:28.12 ID:ZFUQDfs5
STLやboostなら使えるが、素人が書いたtemplateなんて使いものにならないな
禁止されてる理由がわかる
586 :
2016/04/25(月) 09:42:02.50 ID:7tPDaHNy
ヒープじゃなくスタックに値を持つベクトルとかで
次元数をテンプレートにしたりしてるけどな
これテンプレート引数で渡さないと壁にぶつかると思う
587 :
2016/05/02(月) 19:27:51.75 ID:XHrH2XI+
そんなナイーブな理解の人に一々返事してあげるなんて賢者かって…
588 :
2016/05/30(月) 02:44:46.97 ID:Wv9Vl7oG
このスレの進み具合から、TMPの意味がやっと分かったよ
589 :
2016/06/22(水) 18:35:49.27 ID:/RajI6Sy
実際に使われてるのか?
590 :
2016/06/23(木) 03:20:19.54 ID:05qDBgT1
Totemo Muzukashi Programing
591 :
2016/06/23(木) 09:40:20.91 ID:7EyqyniW
頭の体操的な目的には割と良いと思う
TMPをそれなりに嗜んでおけば他の言語が楽に感じる
592 :
2016/07/14(木) 00:08:17.53 ID:NnRKTyQ9
定数式中の&&がショートサーキットしてくれなくて
ムンクの叫びになりかけたんだが、よく考えたら当たり前だよな……
593 :
2016/07/30(土) 18:04:44.54 ID:qgpylzNJ
TMPなんて必要になったことがない、コンパイル時に決定してることなんてあるか?
階乗の計算でTMPでコンパイラに計算させなくても、ハードコーディングでいいじゃん
594 :
デフォルトの名無しさん
2016/07/30(土) 18:32:50.81 ID:WLIyTwaV
>>593
なんでわざわざハードコーディングなんてするん?
TMPでいいじゃん。
595 :
2016/07/30(土) 18:38:48.24 ID:B4kFV2/L
ハードコーディングを手軽にするシステムだろ
596 :
2016/07/30(土) 19:19:37.95 ID:qgpylzNJ
>>594
3の階乗なら6とタイプするほうが早いだろ
597 :
デフォルトの名無しさん
2016/07/30(土) 19:27:27.17 ID:WLIyTwaV
>>596
いや、3とタイプする方が速いが?
598 :
2016/07/30(土) 19:32:38.39 ID:qgpylzNJ
>>597
コードは?
599 :
デフォルトの名無しさん
2016/07/30(土) 19:48:50.85 ID:WLIyTwaV
>>598
コード生成コストはイニシャルコストと考えれば、0とみなせますが?
600 :
2016/07/30(土) 19:51:53.60 ID:B4kFV2/L
TMP嫌ってる奴は関数型言語にアレルギーおこしてそう
601 :
2016/07/30(土) 20:01:44.92 ID:hqfCLm5M
TMP否定派の人って数値計算にしか使えないと思ってるの
602 :
2016/07/30(土) 20:03:27.36 ID:qgpylzNJ
数値計算なんて使い物にならんだろう
入力はコンパイル時に決定してる必要があるんだからw
603 :
2016/07/30(土) 20:15:01.45 ID:t+kcHL9G
ちょっとミスったら訳わからんエラーの洪水が出るのは改善されたのかのぅ
604 :
2016/07/30(土) 21:54:49.81 ID:NYI5chEQ
メタプロ好きな奴でまともにコードテストやってる奴に会った事ない。
605 :
2016/07/30(土) 23:29:13.16 ID:ShugxVkw
テンプレートの単体テスト書くの、しんどいよねw
606 :
デフォルトの名無しさん
2016/07/30(土) 23:34:53.81 ID:WLIyTwaV
>>605
わりと普通のテストでよくね?
607 :
2016/07/30(土) 23:35:01.17 ID:ShugxVkw
あっ>>604のおかげで、自分がテンプレートの異常系のテスト
書けてないことに気づいた! 今!

どうやって書けばいいんだ「コンパイルエラーになったらOK」な
単体テストなんて……
608 :
2016/07/30(土) 23:38:54.87 ID:ShugxVkw
>>606
個人的には辛いんだ
型引数ごとにテストケースが増えるせいで

俺テンプレートの設計がまずいのかもしれないし
テスト環境を使いこなせていないのかも
609 :
2016/07/30(土) 23:47:29.00 ID:ShugxVkw
でも実際、ビジネスでTMP使う機会なんてそんなにないよね
必要なものは大抵ライブラリで揃ってるし

ここ数年ビジネスで書いたテンプレートなんて、sortやmapに渡す
比較ファンクタくらいなもんだ
610 :
デフォルトの名無しさん
2016/07/31(日) 00:52:52.61 ID:BwQhep53
>>609
確かにね。
611 :
2016/07/31(日) 01:15:49.72 ID:xYHlZVXv
ビジネスwww
612 :
2016/08/04(木) 21:55:02.63 ID:bUkZS3Tk
>>603
具体的にどんな? 「オーバーロードが見つからない」とか「候補は:」とかいう奴?
613 :
2016/10/22(土) 12:48:36.20 ID:gXZrk0GL
このスレの伸びなさがTMPの必要性を考えさせるな〜
614 :
2016/10/25(火) 13:36:18.47 ID:tNFHqmMD
https://teratail.com/questions/52686
助けて下さい!!!
615 :
2016/10/25(火) 15:45:43.97 ID:htPnqAhC
バグったコンパイラを捨てろ
616 :
2016/10/30(日) 14:57:03.72 ID:O4GwQcVb
>>614

こいつ、回答側の場合ずいぶん偉そうなものの言い方するやつじゃん
誰が助けてくれるんだよw
617 :
2016/10/30(日) 15:12:35.72 ID:E/dwHQNP
>>616
解決したよ。世間はそんなに冷たくないよ。
618 :
2016/10/30(日) 16:29:00.54 ID:O4GwQcVb
助けてくれた人に感謝しろよ
今後、偉そうにもの抜かすなよ、
619 :
2016/11/11(金) 01:17:57.70 ID:EDumE7xv
template<class T>
void foo(T t){
typedef T::valuetype tt;
//以下略
}

みたいな関数なにがしたいのかな
templateっていろんな型を代表できるのに
上記だと
Tがvaluetypeをもっていないとコンパイルできないじゃん
fooにintなんて渡せない
620 :
2016/11/11(金) 02:50:18.52 ID:R5aqtocD
>>619
valuetypeをメンバに持つクラス/構造体を引数に取ることを想定した関数にしている

templateを使っているからといって、常にどんな型でも使える関数にする必要はない
621 :
デフォルトの名無しさん
2016/11/11(金) 03:38:29.50 ID:CB2qWRAJ
>>619
コンパイルできないようにしてるんだよ…
622 :
2016/11/11(金) 03:54:15.76 ID:cKP8rFBJ
value_typeだろバカ
623 :
2016/11/11(金) 09:56:45.58
インターフェースみたいなものやね
624 :
2016/11/11(金) 20:08:41.83 ID:DxFrXdPz
>>622
>value_typeだろバカ
例だからなんでもいいだろ.バカ
625 :
2016/11/13(日) 20:49:57.87 ID:NMmsi9ae
>>619
の例だと
template<class T>
void foo(T t);
を見ただけでは、Tになにを渡していい、渡すべきかがわからないってこと?

いちいち実装をみなきゃいけないの?
626 :
2016/11/13(日) 23:13:56.74 ID:01e71bgy
Tが何を受け付けるかわからん関数を使うんか?
627 :
デフォルトの名無しさん
2016/11/13(日) 23:57:09.90 ID:Ggvvb/9+
>>625
仕様を理解しないで使っちゃう人のために、コンパイルエラーにしてるんだよ。
628 :
2016/11/14(月) 00:03:42.34 ID:Ndr4XdNg
>>626
うけとる型が決まってるなら、templateにする理由って?
629 :
2016/11/14(月) 00:19:36.49 ID:8AzCWpe2
きみはgenericの汎用性を、あらゆる、という意味と履き違えている。

逆に全ての型に対して使える関数って役に立つの? 意味あるの?
関数の想定している要件を満たすT全てじゃ意味ないの?
630 :
2016/11/14(月) 00:32:58.25 ID:BtUwB/sO
>>619
>Tがvaluetypeをもっていないとコンパイルできないじゃん
valuetypeをもっていたらコンパイルできるんか?
631 :
2016/11/14(月) 01:42:04.43 ID:V+VrG6L9
>>629
その要件を満たすTをどうやって知ることができるんだ?
632 :
2016/11/14(月) 01:55:47.75 ID:esjkHDa1
Java, C#の型制約と同じだろ

Haxe なら、
class A<T : (B, C)> { }

Tには、B, Cか、その派生クラスしか使えない
633 :
2016/11/14(月) 02:30:14.37
∀をつけると一見なんでもって感じで自由を得たような錯覚をするが、実はどんな型が来ても成り立たせないといけないという強烈な不自由を被る逆説的事象に苛むのである
∀は利用側が自由なのであって、提供側は猛烈な不自由の苦しみを味わうのだ

(コラム)
634 :
2016/11/14(月) 02:33:34.84 ID:8AzCWpe2
>>631
その関数のドキュメントなければコードを読む
635 :
2016/11/14(月) 07:57:34.62 ID:cdoyRzEZ
>>632
それならまだいい、関数本体のコードを読まなくても、宣言部だけで利用者はTに必要な要件がわかる。
636 :
2016/11/14(月) 12:21:25.14 ID:7/YTvzPd
宣言部だけで関数の挙動がわかる世界でやってくれ
637 :
2016/11/14(月) 20:38:01.70 ID:xIkiXoiE
>>636
ソースが公開されてない、win32apiは宣言しかわからないよ、それでも十分に宣言を見ればわかる。
638 :
2016/11/14(月) 22:02:59.08 ID:PAYFoA/x
すごいねー
俺はMSDN見ないとフラグの意味とかわからないわー
639 :
2016/11/14(月) 23:40:51.43 ID:Ndr4XdNg
そんなレベルの低い方が回答してたのか・・・
640 :
2016/11/22(火) 02:18:26.11 ID:7Mf+uR5S
特定のクラスしか受け付けないテンプレートってなんなの?テンプレートにしなくてもよくね?
641 :
2016/11/22(火) 02:37:57.83 ID:e1oIg+aV
四則演算が定義された型のみ受け付けたい場合など
642 :
2016/11/22(火) 02:46:07.47 ID:UcbrgWPr
それ、特定のクラスじゃなくてインターフェイス。traits使えば幸せになれるやつ。
643 :
2016/11/22(火) 04:43:58.53 ID:e1oIg+aV
てへぺろ
644 :
デフォルトの名無しさん
2016/11/22(火) 12:51:23.77 ID:OZ794KAs
まあ、特定の1つのクラスしか受け付けないってのなら、確かにtemplateにする意味ないね。
特定でも2つ以上のクラスに対応してるなら、意味あると思うよ。
645 :
2016/11/22(火) 14:30:10.04 ID:uKd48bt3
参照やポインタじゃなくて値型で扱いたいのかもしれない
193KB

新着レスの表示

★スマホ版★■掲示板に戻る■全部前100次100最新50

名前:E-mail: