・ここはC++のテンプレートメタプログラミング専用スレです。
・なかったので立てました。
・前にもあったような気がするけど気にしない。
・次期C++(0x) boost STLの話題も、TMPに関係するならここにどうぞ。
仲良く使ってね。
C++/TemplateMetaProgramming
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2008/02/16(土) 12:45:022008/02/16(土) 12:48:44
とりあえずTMP始めてだから優しくしてね><って人には
p_stabeのとこのブログのログを最初から読んだりしてみる事から始めるといい。
p_stabeのとこのブログのログを最初から読んだりしてみる事から始めるといい。
3デフォルトの名無しさん
2008/02/16(土) 12:49:15 すいません、やっぱり、該当スレでお願いします。
申し訳ありませんでした。
申し訳ありませんでした。
2008/02/16(土) 12:49:55
おい>>1、メタだけあってもしょうがないだろ
何を話題にすりゃいいんだ
何を話題にすりゃいいんだ
2008/02/16(土) 12:50:02
>>1 乙
2008/02/16(土) 12:50:48
>>4
いくらでも話題はあるさね
いくらでも話題はあるさね
2008/02/16(土) 12:51:13
2008/02/16(土) 12:53:14
2008/02/16(土) 12:55:49
>>8
テンプレートスレならNTPとかMOJOばっかりで
Lispみたいなメタプログラミングは話題にし辛いだろう。
ここはそういうのを扱うスレ。コンパイル時点での、コードに対するプログラミングに関するスレ。
テンプレートスレならNTPとかMOJOばっかりで
Lispみたいなメタプログラミングは話題にし辛いだろう。
ここはそういうのを扱うスレ。コンパイル時点での、コードに対するプログラミングに関するスレ。
10デフォルトの名無しさん
2008/02/16(土) 12:59:042008/02/16(土) 13:01:05
とりあえずPreprocessor Metaprogramming万歳
2008/02/16(土) 13:02:02
メタプロと普通のテンプレート使ったプログラムは全然違うだろう。
2008/02/16(土) 13:02:20
STLスレやboostスレとか何度も統廃合の話題が出てその度に荒れていたな
2008/02/16(土) 13:02:53
スレが立った初っ端からいろいろ文句つけてる奴は何だ?
現在、板の各所に散らばっている“テンプレートスレ”で満足しているならこんな所覗く必要はないだろう。
“メタプログラミング”を話題にしたい奴がここを必要としているんだ。興味がないなら来るな。
現在、板の各所に散らばっている“テンプレートスレ”で満足しているならこんな所覗く必要はないだろう。
“メタプログラミング”を話題にしたい奴がここを必要としているんだ。興味がないなら来るな。
2008/02/16(土) 13:03:31
そうだそうだ
2008/02/16(土) 13:04:05
いや、興味あるとかないとかそういう問題じゃねぇーだろw
2008/02/16(土) 13:04:26
2008/02/16(土) 13:05:07
メタプロが理解できない奴が嫉妬してクレーム付けてるだけだろ
2008/02/16(土) 13:06:21
勢いが1234もある。
過疎ったVIPスレ並みに速い流れだな。その割には糞なレス多いけど。
過疎ったVIPスレ並みに速い流れだな。その割には糞なレス多いけど。
2008/02/16(土) 13:07:05
{
std::ofstream f( "tmp.cpp" ) ;
f << いろいろいろいろいろいろ ;
}
system( "cc tmp.cpp" );
system( "a.out" );
では、このあたりからw
std::ofstream f( "tmp.cpp" ) ;
f << いろいろいろいろいろいろ ;
}
system( "cc tmp.cpp" );
system( "a.out" );
では、このあたりからw
2008/02/16(土) 13:08:30
クラックしがいがありそうだなw
2008/02/16(土) 13:10:44
>>20
テンプレート(ライブラリ)を使ったメタプログラミングだwww
テンプレート(ライブラリ)を使ったメタプログラミングだwww
23デフォルトの名無しさん
2008/02/16(土) 13:15:15 だいたい、>>1がアホだからいけないんだ
Templateなんて入れるないで、素直にC++/メタプログラミングすればよかった
Templateなんて入れるないで、素直にC++/メタプログラミングすればよかった
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();
とか、インターフェースの差し替えが出来てけっこう便利な気がするんだけど。
Boost, STLとの統合の話題が出てくるからじゃね?
あっちは使い方、こっちは実装テクニックと使い分けできるといいね。
そういやポリシーってみんなどんぐらい使ってる?
template<class T> class M : public T {};
struct T1 { void t1() {}; };
struct T2 { void t2() {}; };
M<T1>().t1();
M<T2>().t2();
とか、インターフェースの差し替えが出来てけっこう便利な気がするんだけど。
2008/02/16(土) 13:19:13
単純にテンプレートテクニックスレで良かったんじゃね、とか
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 とかでさらに場合分け
とかなって、なんだか力業だなぁとか感じる(答参照)。
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 とかでさらに場合分け
とかなって、なんだか力業だなぁとか感じる(答参照)。
2008/02/16(土) 13:22:12
>>24
スーパークラスに直接Tをいれるのはコンパイルが異様に重くなるので最近は避けているな。
スーパークラスに直接Tをいれるのはコンパイルが異様に重くなるので最近は避けているな。
2824
2008/02/16(土) 13:27:07 >27
エエエ(ry
コンパイルなんて昔に比べると激早だから、あんまり気にしないなあ。
どちらかというと使う側でpimplとかの工夫してるし。
エエエ(ry
コンパイルなんて昔に比べると激早だから、あんまり気にしないなあ。
どちらかというと使う側でpimplとかの工夫してるし。
2008/02/16(土) 13:28:41
そおか、C++以外の言語を使ったあとだと余りの遅さにかなりショックを受けるんだが。
2008/02/16(土) 13:34:03
100ファイル程度あると、C++は自作オーバークロックの最強マシンをもってして三十分や一時間かかりかねないけれど
これがC#だとヘナチョコマシンでも一分掛かるか掛からないかといった所。
これがC#だとヘナチョコマシンでも一分掛かるか掛からないかといった所。
2008/02/16(土) 13:37:46
コンパイル時間のほとんどは
プリプロセスなんだろうなあ。
プリプロセスなんだろうなあ。
2008/02/16(土) 13:48:27
2008/02/16(土) 13:48:37
Boost.Lambdaのヘッダをプリコンパイルドヘッダに入れようとすると、
pchがぶくぶく膨らんでいく。
後のコンパイルでは、プリコンパイルドヘッダの読込も
ボトルネックになっているのではという気がしてならない。
pchがぶくぶく膨らんでいく。
後のコンパイルでは、プリコンパイルドヘッダの読込も
ボトルネックになっているのではという気がしてならない。
2008/02/16(土) 13:50:18
>>31
よほど凝ったことしなきゃそれはないだろ
よほど凝ったことしなきゃそれはないだろ
2008/02/16(土) 13:51:20
プリコンパイルでどれだけの時間が短縮されるか考えたら
そんなもんだと思う
そんなもんだと思う
2008/02/16(土) 13:52:37
プリコンパイルは一応コンパイルもしてるわけで
2008/02/16(土) 13:55:07
>33
ヘッダを重くするとそうなるけど、それこそpimplで隠したら?
Boost.Lambdaをヘッダに突っ込もうとする時点で何か設計で失敗している気がするけど。
#ライブラリを設計しているのならしょうがないけど
ヘッダを重くするとそうなるけど、それこそpimplで隠したら?
Boost.Lambdaをヘッダに突っ込もうとする時点で何か設計で失敗している気がするけど。
#ライブラリを設計しているのならしょうがないけど
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
# 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
2008/02/16(土) 14:03:25
2008/02/16(土) 14:05:43
そらそうだな。
2008/02/16(土) 14:09:20
>39
ヘッダは基本的にインターフェイスなんだから、インターフェイスに不要な実装は隠すのが望ましい。
テンプレート使ってるとそんなことも言ってらんないけど。
ヘッダは基本的にインターフェイスなんだから、インターフェイスに不要な実装は隠すのが望ましい。
テンプレート使ってるとそんなことも言ってらんないけど。
2008/02/16(土) 14:16:12
そろそろC++という言語自体を見直すのが望ましいという気もしないでもない
問題累積しすぎだろ
問題累積しすぎだろ
2008/02/16(土) 14:19:31
>>41
stdafx.hで何もかもインクルードしていたよ。
stdafx.hで何もかもインクルードしていたよ。
2008/02/16(土) 14:32:12
2008/02/16(土) 14:49:06
ある程度確定したクラス他は専用libに放り込んでるので無問題
2008/02/16(土) 14:58:08
・クラス単体のみの宣言だけ
class A;
・クラスのインターフェイスを含めた宣言だけ
class A{ void f(); };
2種類のヘッダを用意すれば(ry
class A;
・クラスのインターフェイスを含めた宣言だけ
class A{ void f(); };
2種類のヘッダを用意すれば(ry
2008/02/16(土) 16:28:15
>41
C++狂Herb Sutterの本を読んだほうが良いと思う。
ヘッダファイル: インターフェイスに関係するファイルを最低限
ソースファイル: できるだけこっちでインクルードする
が基本だよ。
C++狂Herb Sutterの本を読んだほうが良いと思う。
ヘッダファイル: インターフェイスに関係するファイルを最低限
ソースファイル: できるだけこっちでインクルードする
が基本だよ。
2008/02/16(土) 16:31:58
コンパイル時間の節約は分かるんだが、
いざヘッダファイルをインクルードして何か使おうとすると
実装が無いとか文句言われることがあるのが困るんだよな。
いざヘッダファイルをインクルードして何か使おうとすると
実装が無いとか文句言われることがあるのが困るんだよな。
2008/02/16(土) 16:32:21
実装じゃねえや。定義だ。
2008/02/16(土) 16:33:06
>>48
ただの誤用にしか聞こえんのだが、どういう状況の話?
ただの誤用にしか聞こえんのだが、どういう状況の話?
2008/02/16(土) 16:39:01
不完全型のみで十分な状況では
その型を定義してあるヘッダをインクルードせず、
不完全型の宣言のみを書く。
そして、その型を使ってるソースファイルでのみ、
そのヘッダファイルをインクルードする。
その型を定義してあるヘッダをインクルードせず、
不完全型の宣言のみを書く。
そして、その型を使ってるソースファイルでのみ、
そのヘッダファイルをインクルードする。
2008/02/16(土) 16:59:36
なんかC++の基本もまともに出来ないような人が居ますね。
2008/02/17(日) 02:18:38
TMPやるにはHaskell勉強した方が良いって本当ですか?
2008/02/17(日) 02:20:47
2008/02/17(日) 10:28:54
SICP読んだらModern C++ Designが分かった
2008/02/18(月) 13:01:03
Scheme勉強したらModern C++ Designが分かった
2008/02/18(月) 13:47:54
あれって別の関数型言語を勉強してからじゃないと理解できないほど難しいか?
2008/02/18(月) 13:59:44
ムチャクチャな書き方をしないといけないからわかりにくいんだよ。
すっきりした表記の関数型言語を勉強した後だと
どういうトリックなのかがすんなり理解できる。
すっきりした表記の関数型言語を勉強した後だと
どういうトリックなのかがすんなり理解できる。
2008/02/18(月) 14:01:52
別に無茶苦茶ではないと思うが。
2008/02/18(月) 14:54:27
再帰に継承が絡んでくると難しく感じる。
2008/02/18(月) 14:56:58
慣れてないだけだな。それにあんなもの別にC++以外のものを触ったって慣れやしない。
2008/02/18(月) 15:32:39
ところで>>2のp_stabeには誰もつっこまないの?
p_stadeじゃないかって
p_stadeじゃないかって
2008/02/18(月) 15:37:29
q_stabe
2008/02/18(月) 16:57:57
>>61
それは違うと思う。関数型言語のほうが記法が簡便だが抽象度が高く
センスが必要。LispでもSchemeでも自在に扱えればC++のメタなんて少し
の時間でマスターできる。templateなんて少しの時間でマスターできる。
経験上確信してる。逆は成立しない。
それは違うと思う。関数型言語のほうが記法が簡便だが抽象度が高く
センスが必要。LispでもSchemeでも自在に扱えればC++のメタなんて少し
の時間でマスターできる。templateなんて少しの時間でマスターできる。
経験上確信してる。逆は成立しない。
2008/02/18(月) 17:19:20
千差万別、十人十色
自論に固執すること愚か也
自論に固執すること愚か也
2008/02/18(月) 17:32:39
言語に組み込まれてるってのは重要だよな。
C++だとマクロとかでちょっと文法の解釈を脳内変換すれば
いいんだけど手間が増大するのと
初学者に扱える代物ではなくなってしまうんだよね。
C++だとマクロとかでちょっと文法の解釈を脳内変換すれば
いいんだけど手間が増大するのと
初学者に扱える代物ではなくなってしまうんだよね。
2008/02/18(月) 18:10:14
>>65
関数型言語の経験ないだろ?
関数型言語の経験ないだろ?
2008/02/18(月) 18:10:49
>>65
SICPは読んだ?
SICPは読んだ?
2008/02/18(月) 18:25:10
負けへん、負けへん
山ちゃんは負けへんでええ
山ちゃんは負けへんでええ
2008/02/18(月) 18:25:39
誰か質問しろよ。
スレ落ちるの時間の問題だな。
スレ落ちるの時間の問題だな。
2008/02/18(月) 18:30:41
C++0xではmplは入らなくてTypeTraitsどまりってことは
mplはまだ重視されてないってこと?メイヤーズの本では
TMPがC++の中心に来ることはないなんて書いてあったけど
どうなんだろ?
mplはまだ重視されてないってこと?メイヤーズの本では
TMPがC++の中心に来ることはないなんて書いてあったけど
どうなんだろ?
2008/02/18(月) 19:20:00
そうなんでしょう。
だって頭の体操にはなるけど、あんまり実用性ないじゃん。
だって頭の体操にはなるけど、あんまり実用性ないじゃん。
73デフォルトの名無しさん
2008/02/18(月) 19:27:11 type_traitsはフレームワークであって、
みんなが自分のクラスのtraitsを提供しないと真価を発揮しないけど、
mplは使いたい人が使えばいいだけだから標準化しなくても困らない。
みんなが自分のクラスのtraitsを提供しないと真価を発揮しないけど、
mplは使いたい人が使えばいいだけだから標準化しなくても困らない。
2008/02/18(月) 19:38:50
C++0x において提案されている <type_traits> で提供される機能の中には
コンパイラが持っている独自の情報を吐いてくれないと実装できないものも多いので
そういう意味で TypeTraits は優先的に規格として明示してくれないと困るかと
コンパイラが持っている独自の情報を吐いてくれないと実装できないものも多いので
そういう意味で TypeTraits は優先的に規格として明示してくれないと困るかと
2008/02/18(月) 19:40:35
call_traits は追加されるの?
2008/02/18(月) 20:41:26
MP専用の構文を入れる気はもうないのかね
Templateでできたのはたまたまであって、
いつまでもあんなハックみたいな書き方したくないなぁ
Templateでできたのはたまたまであって、
いつまでもあんなハックみたいな書き方したくないなぁ
2008/02/18(月) 23:08:07
バッドノウハウ
2008/02/19(火) 02:44:27
完全体のC++かどうかを判断するために
compiler_traits
が必要な気がする。
compiler_traits
が必要な気がする。
2008/02/19(火) 02:49:56
そうなるとまず has_compiler_traits が必要だな。
2008/02/19(火) 21:01:07
>>76
D言語の出番ですね、分かります
D言語の出番ですね、分かります
2008/02/19(火) 23:57:02
いやあ、すべってるねえ このスレ
2008/02/20(水) 00:07:56
昔ProgramingJemsにメタプログラミングでsinテーブルを生成するっていうネタがあった
当時メタプログラミングなんて知らなくて、
「すげぇぇぇぇ」と感動して自分でも作ってみた
しかし当時のオレのショボマシンではコンパイル時のサインテーブルの生成に結構な時間がかかり
最終的に、
Perlでテーブル書いたソースジェネレートした方が早くね?
という結論に
当時メタプログラミングなんて知らなくて、
「すげぇぇぇぇ」と感動して自分でも作ってみた
しかし当時のオレのショボマシンではコンパイル時のサインテーブルの生成に結構な時間がかかり
最終的に、
Perlでテーブル書いたソースジェネレートした方が早くね?
という結論に
2008/02/20(水) 00:13:14
メタプログラミングとは?
テンプレート、型、typedef、コンパイル時定数、再帰を
駆使したコンパイル時プログラミングで合ってる?
テンプレート、型、typedef、コンパイル時定数、再帰を
駆使したコンパイル時プログラミングで合ってる?
2008/02/20(水) 00:15:48
テンプレートメタプログラミングならそれでまあ合ってる。
2008/02/20(水) 00:18:10
>>83
それはテンプレートメタプログラミングの説明だな
メタプログラミング自体はもっと広く、プログラムを操作するプログラム全般をいう
プリプロセッサを使うのもメタプログラミングだし、コードジェネレータを書くのも含む
それはテンプレートメタプログラミングの説明だな
メタプログラミング自体はもっと広く、プログラムを操作するプログラム全般をいう
プリプロセッサを使うのもメタプログラミングだし、コードジェネレータを書くのも含む
2008/02/20(水) 00:20:22
テンプレート抜けてた。
2008/02/20(水) 00:43:39
そういう意味では82のPerlでソース生成と言うのも立派なメタプログラミング。
2008/02/20(水) 01:04:07
>>82
そんなあなたに constexpr@C++0x
そんなあなたに constexpr@C++0x
2008/02/20(水) 01:06:00
一方D言語はsinを定数として畳み込んだ。
2008/02/20(水) 01:09:59
静的に実行できる関数は静的に実行してしまう。
D は中々のものだ。
D は中々のものだ。
2008/02/20(水) 01:35:24
D言語って誰が生みの親なの?
2008/02/20(水) 01:36:25
昔borlandで働いてた人
2008/02/20(水) 01:37:28
をるたん
2008/02/20(水) 01:40:52
>>92
じゃあ流行らないな
じゃあ流行らないな
2008/02/20(水) 01:43:40
ボーランドはちがくね?
2008/02/20(水) 18:26:21
>>82
まあC++のテンプレートはメタプログラミングのために設計されてないからねえ。
マクロらしいマクロを持った言語なら、かなり高度なメタプログラミングをやってても
普通のコードの2倍やそこらの時間でコンパイルできる。
Lispの世界じゃ40年前からメタプログラミングが当たり前だし、
DOSの世界ではMASMのマクロで構造化なんてのが流行った。
まあC++のテンプレートはメタプログラミングのために設計されてないからねえ。
マクロらしいマクロを持った言語なら、かなり高度なメタプログラミングをやってても
普通のコードの2倍やそこらの時間でコンパイルできる。
Lispの世界じゃ40年前からメタプログラミングが当たり前だし、
DOSの世界ではMASMのマクロで構造化なんてのが流行った。
2008/02/20(水) 18:35:23
ライブラリ作るときは主流になりそうだけどな。
てか、もうなってるか。
でもschemeのほうが言語機能としてcons listとか
があるから、より簡潔でストレス感じない。
C++のTMPはいかんせん表現がキモ過ぎる。
てか、もうなってるか。
でもschemeのほうが言語機能としてcons listとか
があるから、より簡潔でストレス感じない。
C++のTMPはいかんせん表現がキモ過ぎる。
2008/02/20(水) 21:15:57
そこで constexpr ですよ
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++; };
}
自分のプログラムでは活用できてるからいいんだけど、意外と汎用性ないな……
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:48101デフォルトの名無しさん
2008/02/25(月) 16:49:57 >>99
typeidの速度が気になる場面で使うのかな?
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++; }
}
これでよくない?
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:44105デフォルトの名無しさん
2008/02/25(月) 17:16:00 >>104
UniqueNumber::number<A>()とかUniqueNumber::number<B>()みたいな使い方するんでしょ。
で、テンプレートに渡した型毎に一定のユニークな値が返ってくると。
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にならないのかな?
でも
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にならないのかな?
107106
2008/02/25(月) 17:38:05 わかりますた。なるほど。
10899
2008/03/01(土) 03:50:23 応用例作ってみた。
ttp://fiercewinds.net/siki/pub/2008/03/01_032951/
継承で登録を強制できれば便利そうなんだけどなぁ。
あとファクトリ関数みたいに関数の引数とか戻り値にそのクラスを含む場合は、こんな大掛りな仕掛けは不要みたい。
……それ以前に言語側で何とかして欲しいよな。こんなの。
ttp://fiercewinds.net/siki/pub/2008/03/01_032951/
継承で登録を強制できれば便利そうなんだけどなぁ。
あとファクトリ関数みたいに関数の引数とか戻り値にそのクラスを含む場合は、こんな大掛りな仕掛けは不要みたい。
……それ以前に言語側で何とかして欲しいよな。こんなの。
109デフォルトの名無しさん
2008/03/15(土) 21:46:47 ちょっと質問です。
外部リンケージについて詳しく書いてある解説ってある?
具体的には関数内クラスをテンプレートパラメーターにして渡したいんだけどね。
externでも上手く行かんし……
外部リンケージについて詳しく書いてある解説ってある?
具体的には関数内クラスをテンプレートパラメーターにして渡したいんだけどね。
externでも上手く行かんし……
110デフォルトの名無しさん
2008/03/15(土) 21:51:35 それはそもそも無理じゃまいか?
112デフォルトの名無しさん
2008/04/10(木) 23:41:05 メタプログラミングしてると脳汁でます
113デフォルトの名無しさん
2008/04/11(金) 00:39:33 なぜjavaやC#でtemplateが外されたか
不要物だからw
不要物だから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ってどうやって実現してるんですか?
_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を組み合せればいけるはず
122デフォルトの名無しさん
2008/05/14(水) 07:35:58 どうみてもg++
>>122
ありがとう。
ありがとう。
124デフォルトの名無しさん
2008/05/19(月) 02:14:25 テンプレートの実体化でテンプレート引数を特殊化にマッチさせる過程って
Prologの統一化と似てる気がする
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を適応させることができるようにしたいです。
長くなりましたが、皆様宜しくお願いします。
のような型にユニークな数字を割り当てるのをコンパイル時にできないでしょうか?
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*にキャストすれば比較もできるんじゃね?
分割コンパイルみたいな局面を考えると、ある型にユニークな数字が割り当て済かどうかすら判らんと思う。
リンカと連携すればいいんだろうけど、C++の規格はそこまで考えてないんじゃない?
指定された型のstaticポインタを用意してそのアドレスを使えばなんとかなるかも知れんが、どうなんだろ?
void*にキャストすれば比較もできるんじゃね?
127デフォルトの名無しさん
2008/06/01(日) 18:57:02 そもそも数字の割り当て方を制御できないとソートする意味がなくね?
どう割り当てたいの?
どう割り当てたいの?
128デフォルトの名無しさん
2008/06/01(日) 19:09:24 どんな数値でもいいから割り当ててしまえば二分探索の恩恵を受けられるってことだろ
129デフォルトの名無しさん
2008/06/02(月) 02:49:12130デフォルトの名無しさん
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は線形時間が掛ると書いてあるので
二分探索するには自分でコードを書かないといけないようです.
で書いた事をもう少しわかりやすく説明すると
例えば以下のような型があったとき、
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は線形時間が掛ると書いてあるので
二分探索するには自分でコードを書かないといけないようです.
2008/07/09(水) 14:39:37
132デフォルトの名無しさん
2008/07/16(水) 20:46:07 『Modern C++ Design―ジェネリック・プログラミングおよびデザイン・
パターンを利用するための究極のテンプレート活用術 (C++ In‐Depth Series) 』
ってのを読んでいる素人だけど、69ページのMostDerivedってのが
マジ分からん。今日、朝、昼、晩を合計で4時間ぐらい考えたんだが
どういう流れでこれで継承関係でいちばんの派生なのを特定できるのか
分からん。誰か分かる人いませんか?
パターンを利用するための究極のテンプレート活用術 (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はダメだったって話を他でも見かけたよ
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 を比較した結果が返ってくる。
>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……
}
ローカルクラスの静的関数は関数テンプレートの引数に指定可能というのがあるのですが、
ローカルクラスのクラス内クラスの場合どうなりますか?
役立たず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になりますね。
言語拡張を無効にすると色々なライブラリが使い物にならなくなるから、
さすがにそこまでストイックにはなれないなぁ……
サンクス。無効にすると両方ともNGになりますね。
言語拡張を無効にすると色々なライブラリが使い物にならなくなるから、
さすがにそこまでストイックにはなれないなぁ……
138デフォルトの名無しさん
2008/08/31(日) 17:08:18 言語拡張機能が使用された場合に警告を出すってオプションがあったと
思うんで、取り合えずそれONにしとけば?
思うんで、取り合えずそれ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>部分の採用がヨクワカラナイ
どこかに良い説明のってないっすか
これのtemplate <class Create>部分の採用がヨクワカラナイ
どこかに良い説明のってないっすか
142デフォルトの名無しさん
2008/10/19(日) 02:40:29 とりあえず検索用語だけ
template-template-parameters
template-template-parameters
143デフォルトの名無しさん
2008/10/24(金) 23:27:12 class Hoge {
template <int X> void Fuga() {...}
};
テンプレート引数Xの値を、静的な値として集めることってできますか?
具体的には、呼び出されたFugaのうち、最も大きいXを取得して、別のクラステンプレートに渡すとか。
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:2614799
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/
解説がクソなのは置いといて下さい。
もっと良い実装があればそれも紹介して欲しいです。
個人的には
・いちいち登録しなきゃいけないのが面倒。
・トランポリン関数を保持する配列が疎になるのでメモリ効率が悪そう……
というところが気になるところです。
どうしても欲しくなったのでマルチメソッドを実装したんだけど、もっと効率的になる改善点てあります?
(詳細)ttp://cvs.sourceforge.jp/view/siki/siki/src/holder.hpp?rev=1.1&view=markup
(解説)ttp://fiercewinds.net/siki/pub/2009/01/12_191240/
解説がクソなのは置いといて下さい。
もっと良い実装があればそれも紹介して欲しいです。
個人的には
・いちいち登録しなきゃいけないのが面倒。
・トランポリン関数を保持する配列が疎になるのでメモリ効率が悪そう……
というところが気になるところです。
14899
2009/01/13(火) 00:44:59 ちょっとだけ >147を修正。
登録をヘルパークラスに任せることにしました。少しはスマートに見えるけど、受け入れる型を
全部登録しなきゃいけないのは変わらず……
色々と考えてみたけど、どうやっても仮想関数に型情報は渡せなさそうね……。
登録をヘルパークラスに任せることにしました。少しはスマートに見えるけど、受け入れる型を
全部登録しなきゃいけないのは変わらず……
色々と考えてみたけど、どうやっても仮想関数に型情報は渡せなさそうね……。
14999
2009/01/13(火) 01:15:20 リンク間違えてたので修正します。
(詳細)ttp://cvs.sourceforge.jp/view/siki/siki/src/holder.hpp?view=markup
(詳細)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にあたるものが増えてくると関数の組み合わせ爆発が大変です。
手法にこだわりはないのでこのやり方が楽、などあればきいてみたいです。
適当な乱数を発生させる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のゲッター書くなりセッター書くなりしろ。
struct rs{ int rdm(){ return rand() % 7 + 60 } };
template<typename Ty> struct rc{ Ty value; int rdm(){ return value * (rand() % 128); } };
後はrc::valueのゲッター書くなりセッター書くなりしろ。
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) );
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());
これは良いですね!頂きます。
使ってみて、若干罠というか、引数なし版はプロトタイプ宣言と勘違いされるため
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:23156デフォルトの名無しさん
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();}
};
でいいでしょ。
ポインタじゃなくて、値のコピーのほうが、いろいろいいよ。
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を使う利点が整理できてないので考えてみます。
>ポインタじゃなくて、値のコピーのほうが、いろいろいいよ。
シンプルながら、これは説得力ありますね
そもそもtenmplate無くても動きますね・・難しいなぁ
ある意味、template使わなくてもポリシーベースのプログラミングが出来るわけですね
あえてtemplateを使う利点が整理できてないので考えてみます。
>ポインタじゃなくて、値のコピーのほうが、いろいろいいよ。
シンプルながら、これは説得力ありますね
159デフォルトの名無しさん
2009/01/24(土) 16:43:24 >>155-156
R<r> a;でいいじゃない。
R<r> a;でいいじゃない。
160157
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 引数を明示したいならね。
> あえて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()));
が楽だと思うけどね。
たまたま‘r’という短い名前だからそれでいいかもしれんが、
名前が長かったり、さらにネストしたテンプレートクラスだったりすると
書くのも面倒だよ。
他にも
R<r> a = R<r>(r());
とか考えられるけど、やっぱり
R<r> a((r()));
が楽だと思うけどね。
age
163デフォルトの名無しさん
2009/03/12(木) 22:20:49 テンプレートの引数にテンプレート渡せるのか〜知らなかった。
これで大分やれることが広がったぜ。ウヒヒ
ていうか、テンプレートの完全な仕様ってどこに行けばみれるの?
これで大分やれることが広がったぜ。ウヒヒ
ていうか、テンプレートの完全な仕様ってどこに行けばみれるの?
164デフォルトの名無しさん
2009/03/12(木) 22:27:47165デフォルトの名無しさん
2009/04/06(月) 19:01:46 Modern C++ Design(和訳)の正誤表を確認したいのだけど、どこかにないかな?
ぐぐると↓のURLらしいが、今はアクセスできないようだ・・。
http://www.biwa.ne.jp/~mmura/ModernC++Design/errata.html
ぐぐると↓のURLらしいが、今はアクセスできないようだ・・。
http://www.biwa.ne.jp/~mmura/ModernC++Design/errata.html
166デフォルトの名無しさん
2009/04/06(月) 20:06:32167デフォルトの名無しさん
2009/04/06(月) 20:20:17168デフォルトの名無しさん
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:05170デフォルトの名無しさん
2009/04/06(月) 21:08:12 Loki とroki さてどっちでしょう
>>165には関係ない話題ですがww
>>165には関係ない話題ですがww
171デフォルトの名無しさん
2009/04/06(月) 21:28:26 流れを気にせず好き勝手に意見を述べるが
先に関数型を勉強してからMC++Dを読む方が
すっきり理解出来る気がする
要は、既に確立した技術をC++に応用したわけだが
このロシアおっさんのとんでもない所は
要素技術とでも言うべき箇所、
例えば...やらsizeofの評価順序やら型としてのstructやらを
C++の仕様から見つけ出したところだと思うわ。
コンパイラが対応してない時代にどんだけ仕様把握してるんだよ
パねぇっす
宇宙ヤヴァイの改変コピペが作りたくなるぐらい。
先に関数型を勉強してから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))で代替とするケースのほうが
プログラミングしてて多いように感じる
アイスをねだるゴマちゃんに
豆腐を与える静的なダックタイピング
structuralなポリモフィズムのことだっけ?
C++0xでたら考えよう。それまでは関数型で遊んでる
ところで、ポリシーによるプログラミングが
綺麗に適用出来るケースって、結構少ない気がするんだ
AがB/C/Dで代替出来るケースよりも
AがA(B)やA(B(C))で代替とするケースのほうが
プログラミングしてて多いように感じる
175デフォルトの名無しさん
2009/04/07(火) 03:30:43176デフォルトの名無しさん
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 製品コンパイラ開発者
by 製品コンパイラ開発者
182デフォルトの名無しさん
2009/04/29(水) 12:40:40 その程度のコンパイラ開発者なら要らん。
183デフォルトの名無しさん
2009/08/12(水) 01:02:13 そうです TMPは導入されたのではありません
発見されたのです!
発見されたのです!
自動焼人 ★ = 自動保守 ◆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/
にて自動焼人 ★までご連絡ください
名言集 その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付だった -> 仮想関数あった。
クラスに仮想関数があるかどうかの話なら、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/
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なら解決できますか?
必要な深度のメタマップクラスを造ってくれるんです
内部でリストを持ち
要素の連綿の登録後
この要素は何個あるとか確率はなんぼとか返せるように造ると
しかし要素がペアだった時は同時確率を求められるようにしたいとします
その為に内部ではリストでなくマップで持つとします
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メンバのアドレスを取るとか…
staticメンバのアドレスを取るとか…
201デフォルトの名無しさん
2009/09/18(金) 08:17:56 ああ、コンパイルタイム定数じゃないから駄目だな
20299
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&
懐しい話題だな。
分割コンパイルが可能なうちは不可能だと思う。リンカと連動できれば違うんだろうけど。
実行時で良ければ>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 した値を相互(キー値、ハッシュ値)で検索し合えれば
少し幸せになれるかと思いました、質問させてください、よろしく。
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 いろいろそろってますね。
流石boost いろいろそろってますね。
206デフォルトの名無しさん
2009/09/20(日) 01:25:15 static const char* foo = "FOO";
これを
static char* foo = "FOO";
このような型に変換したいのですが
template を用いてconst 剥がしが出来ないでしょうか?
これを
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;
〜省略〜
}
配列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:57210デフォルトの名無しさん
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 剥がせません無いのですが、いい方法が無いんでしょうか?
>>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:19213デフォルトの名無しさん
2009/09/20(日) 09:57:31 const剥がしの目的にもよるが、面倒とかよく分からないとかいう理由で剥がすのは
危険だからちゃんと慣れるべき。Cでポインタ分からないままコーディングするのに
近いレベル。
constを剥がす正当な理由は、「const非対応な古いコードor糞コードと組み合わせ
なきゃならない時に仕方なく」というもの。それはconst_castでやる。
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使えるけどね^ε^
ただものすごく面倒臭いし遅い。
0xではコンパイルタイムにfloatとdouble使えるけどね^ε^
219デフォルトの名無しさん
2009/09/20(日) 17:17:11 どこまで近似するか決めないと浮動小数演算そのものが無理だしな
コンパイルが糞遅いのは、プリコンパイルヘッダが優秀なコンパイラならマシになる
かもしれない
でもまぁ現実的に考えればC++0x待ち
コンパイルが糞遅いのは、プリコンパイルヘッダが優秀なコンパイラならマシになる
かもしれない
でもまぁ現実的に考えればC++0x待ち
220デフォルトの名無しさん
2009/09/20(日) 18:07:14 現行では整数の対で有理数を作って近似するしか無いね。
constexprの実装まだー。
constexprの実装まだー。
221デフォルトの名無しさん
2009/10/02(金) 17:47:34 あるクラスが
・メンバ変数Xをもっているか否か
・メンバ関数Yをもっているか否か
を調べる方法はありますん?
typedef Zを持っているかどうかはわかったんですが・・・
・メンバ変数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;
}
それ以外はコンパイルエラー
といった感じで分岐させたいです
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 クラス作っちゃった方がいいんじゃないかな。
移植性のある方法では現行 C++ では出来ないと思う。
VC だと __if_exists があるし、処理系によっては SFINAE の適用範囲が広くて使えるかもしれない。
無理して頑張ったところでどうせ意味論までは確認できないんだから、素直に traits クラス作っちゃった方がいいんじゃないかな。
225デフォルトの名無しさん
2009/10/04(日) 16:21:57 Boostライブラリはたまに移植性のない方法を無理矢理カバーしてるからなぁ
あとC++0xなら普通に作るはず
あとC++0xなら普通に作るはず
226デフォルトの名無しさん
2009/10/12(月) 16:26:18 TMPを発見するような事を真にハックするって言うんだよな
227デフォルトの名無しさん
2009/10/17(土) 13:31:04 コンパイル時に文字列って操作できる?
staticな配列が無いからタイプリストにchar2typeを詰め込んで・・・とか思ったけどすごいめんどくさそうだ
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で取り出せる
みたいな感じで
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!"));
>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 は全部通ってるみたい。
後、嫌だったら別に一文字づつ書いても構わないみたいだ。
multicharacter literal についてならその通り。4文字以下ってのも実装依存っぽいけど。
その辺は吸収するつもりなんだろ、きっと。primary test compilers だと test は全部通ってるみたい。
後、嫌だったら別に一文字づつ書いても構わないみたいだ。
236デフォルトの名無しさん
2009/11/09(月) 12:25:10 TMPを理解するのに必要なIQはいくつですか?
126しか無いんですが、難しいですか?
126しか無いんですが、難しいですか?
237デフォルトの名無しさん
2009/11/09(月) 12:35:12 しらねーけど子供の頃130だった俺は楽勝だから126でも大差ねーだろ
238デフォルトの名無しさん
2009/11/09(月) 12:36:16239デフォルトの名無しさん
2009/11/09(月) 17:37:20 TMPが難しいのは修得人口が少ない(よって解説も少ない)のと
C++のテンプレートが元々TMP用のものではないことによる不合理性が原因。
別に理論として難しいわけじゃない。
C++のテンプレートが元々TMP用のものではないことによる不合理性が原因。
別に理論として難しいわけじゃない。
240デフォルトの名無しさん
2009/11/09(月) 18:12:34 メタしないC++になんの価値が有るの
いまどき
いまどき
241デフォルトの名無しさん
2009/11/09(月) 18:20:36 なんだと
メタメタにしてやろうか小僧
メタメタにしてやろうか小僧
242デフォルトの名無しさん
2009/11/10(火) 05:49:32243デフォルトの名無しさん
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の???をテンプレートパラメータから決定することはできますか?
{
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;
};
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;
};
の方がいいか。
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 とか。
別解として 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なの?
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の特殊化分岐ってできましたっけ?
templateの特殊化分岐ってできましたっけ?
251デフォルトの名無しさん
2009/12/02(水) 00:44:28 enable_if_cだった
252デフォルトの名無しさん
2009/12/02(水) 15:34:58 そりゃできるだろ
253250-251
2009/12/02(水) 17:39:30 眠かったので分けの分からん文章書いてしまいましたが、
250書いたすぐ後にenable_if_cで定数比較ができるのが分かりました。
<enable_if使ってできねーできねー言って悩んでたまぬけ
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 とかはそういう実装になってないから、何か問題があるんだと思ったのですが。
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:33261デフォルトの名無しさん
2010/01/22(金) 19:33:45 俺はLokiのInt2Typeを見て感動したなぁ。
整数定数を与えると、値ごとに異なる型を返すテンプレート。
99と逆な感じかな。
整数定数を与えると、値ごとに異なる型を返すテンプレート。
99と逆な感じかな。
262デフォルトの名無しさん
2010/01/22(金) 23:23:14263デフォルトの名無しさん
2010/01/23(土) 00:16:20 まあ、条件分岐やフラグをコンパイラに押し付けているのがポイントかね。
遠い将来にC++が自己書き換えプログラムを作るようになったら効率化するかもね。
誰か>202のマルチスレッドにコメントしてくれないかしらん。
boost::anyで標準対応してくれないかなぁ……
遠い将来にC++が自己書き換えプログラムを作るようになったら効率化するかもね。
誰か>202のマルチスレッドにコメントしてくれないかしらん。
boost::anyで標準対応してくれないかなぁ……
264デフォルトの名無しさん
2010/01/23(土) 01:10:26 >>99ってひとつのEXEであれば型の数が確定してると思うけど
最新のVCあたりなら最適化で定数になったりしないの?
最新の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だけど。
>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を得るイディオムって有りますか?
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
どっちも駄目なら諦める
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:59277デフォルトの名無しさん
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好きは、訳が悪くても読まないとね。
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, ...);
}
が存在するかどうか調べることってできる?
リンクできるかどうかは流石に無理だろうから、宣言できるかどうかだけでも調べたい
namespace x
{
r f(a1, a2, ...);
}
が存在するかどうか調べることってできる?
リンクできるかどうかは流石に無理だろうから、宣言できるかどうかだけでも調べたい
284デフォルトの名無しさん
2010/05/30(日) 15:05:19 >283
どこまで厳密に調べたいかによるけどものすごく適当にやるとこんな感じ?
ttp://codepad.org/aNznrWhl
どこまで厳密に調べたいかによるけどものすごく適当にやるとこんな感じ?
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です
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でも参考にすりゃ出来るんじゃないの
異なる型からなるシーケンスに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です!
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:51302デフォルトの名無しさん
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; //事前展開してくれない
どのように組めばよいでしょうか?
例えば以下のコードのような感じで、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:00305デフォルトの名無しさん
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; }; // これを省略するとなぜかエラーが出る…なぜだ…
ありがとうございます
再帰で書き直して置き換える感じなのだと理解しました
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
こういうのだろうか
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);
全部同じオブジェクトで呼び出せるクラス。
これもメタプログラミングなのかな?
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:40311デフォルトの名無しさん
2010/10/30(土) 10:36:41312デフォルトの名無しさん
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>();
}
* 関数定義が増えたり#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*じゃダメなのはわかるんだけど
void*じゃダメなのはわかるんだけど
314デフォルトの名無しさん
2010/11/29(月) 22:23:11 Boost.Anyのソースを読むといい。
315デフォルトの名無しさん
2010/11/29(月) 23:12:18316デフォルトの名無しさん
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>>;
ってしなくても 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)かかる〜とかこの処理はオーバーヘッドが大きい〜とか
これは展開にO(n^2)かかる〜とかこの処理はオーバーヘッドが大きい〜とか
331デフォルトの名無しさん
2011/05/04(水) 02:35:23.67 時間がかかる程高度なことやってる気になる
332デフォルトの名無しさん
2011/05/04(水) 14:06:48.82 >>330
Boost.MPL のアルゴリズムにも計算量が定義されていたりする。
Boost.MPL のアルゴリズムにも計算量が定義されていたりする。
333デフォルトの名無しさん
2011/05/04(水) 14:40:18.86 テンプレートでプログラムを表現するコードを書いてみた。
http://codepad.org/Ol10cCgK
実行時にできる事をテンプレートで作成してもなんの意味も無いけど、
テンプレートプログラムを元にクラスを生成するならオートマトン(構文解析器等)
作成なんかで便利そうな気がする。
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みたいなのを書かないようにする仕組みじゃないのか?
MethodExExExみたいなのを書かないようにする仕組みじゃないのか?
338デフォルトの名無しさん
2011/05/07(土) 00:49:16.57339デフォルトの名無しさん
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のサイズを知りたい
};
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でとるべき。
enum{ size = sizeof(hoge) };
}
hogeを直接クラス内で書けばテンプレート引数は省略できる。よってthis_typeは必要ない。
staticおよびconst修飾ではなくenumでとるべき。
342デフォルトの名無しさん
2011/05/08(日) 23:42:58.58343デフォルトの名無しさん
2011/05/09(月) 00:02:27.71344デフォルトの名無しさん
2011/05/09(月) 05:39:16.38 >>342
VC9.0「はい。」
VC9.0「はい。」
345デフォルトの名無しさん
2011/05/09(月) 09:28:32.30 class c{
int a[sizeof (c)+1];
};
サイズ取れたらどうなるの?
int a[sizeof (c)+1];
};
サイズ取れたらどうなるの?
346デフォルトの名無しさん
2011/05/09(月) 10:06:10.09 クラスはクラス定義の終了以後に定義されるので、
クラス定義内では、クラス名は不完全型として扱われる。
sizeofのオペランドに不完全型を渡すと鼻から悪魔。
そのため、>>341,354のようなコードは不可。
クラス定義内のメンバー関数定義における仮引数と戻り値の型は、
クラス名を使ってもいいとされている。
そうしないと、クラス定義内で自分のクラス型を使うメンバー関数を定義できないから。
クラス定義内では、クラス名は不完全型として扱われる。
sizeofのオペランドに不完全型を渡すと鼻から悪魔。
そのため、>>341,354のようなコードは不可。
クラス定義内のメンバー関数定義における仮引数と戻り値の型は、
クラス名を使ってもいいとされている。
そうしないと、クラス定義内で自分のクラス型を使うメンバー関数を定義できないから。
347デフォルトの名無しさん
2011/05/09(月) 10:51:44.39348デフォルトの名無しさん
2011/05/09(月) 11:12:45.24 C++ではそうだけど、sizeofに不完全型を渡すってのが鼻から悪魔の元ネタだからつい。
349デフォルトの名無しさん
2011/05/09(月) 11:26:33.85350デフォルトの名無しさん
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を未定義動作になると解釈して鼻から悪魔が出ても文句は言えないと例えたのは元ネタ?を書いた人の誤解のように思える。
(今の感覚では未定義動作になると明言していない以上そもそもコードとして実行しない=その時点でコンパイルエラーにする、と読むほうが自然だと思う)
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
(適用する余地が少しはあるように読める)
規約の"shall not"は「してはならない」と訳す。
"shall"は「しなければならない。」
この辺の用語、訳は法令に準じてる。
原文でももちろん同じ。
上のURLの記事はどちらも酷いなw
352デフォルトの名無しさん
2011/05/09(月) 20:18:27.64353デフォルトの名無しさん
2011/05/09(月) 20:39:26.68 >>350-351
いやshall notに違反したらundefined behaviorだってちゃんと書いてあるだろ
いやshall notに違反したらundefined behaviorだってちゃんと書いてあるだろ
354デフォルトの名無しさん
2011/05/09(月) 22:47:27.65355デフォルトの名無しさん
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.
こっちじゃないか?それとも別の記述?
よくわからん。
> 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, ...
ここ。
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
それは診断メッセージの話であって一連の流れとは無関係に思えるけど。
未定義動作の一つとして診断メッセージを出してエラーにするというのはありでも
違反があったときに診断メッセージを出さなければいけないからその違反は未定義動作であるということにはならないでしょう。
それは診断メッセージの話であって一連の流れとは無関係に思えるけど。
未定義動作の一つとして診断メッセージを出してエラーにするというのはありでも
違反があったときに診断メッセージを出さなければいけないからその違反は未定義動作であるということにはならないでしょう。
358356
2011/05/10(火) 02:04:23.78359デフォルトの名無しさん
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に不完全型を渡すは未定義動作じゃなくコンパイルエラーだな。
> 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.81361デフォルトの名無しさん
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;
}
#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
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を特殊化するための識別子としてだけ
使いたいんだけど、広域空間にあると他の名前との干渉が気になって
安易に使えない。
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; } とでもしておけばいいんじゃない?
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;
};
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.69371デフォルトの名無しさん
2011/05/26(木) 00:51:48.23なるほど。その手があるな。
もう少し代替手段を考えたいとこでもあるけど。
372デフォルトの名無しさん
2011/05/26(木) 01:04:00.31 >367
Cellを含めて適切なnamespaceに置いたら?
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);
実際には関数の中で使用するからどこの名前空間で使われるか解らん。
もっと現実に忠実に書くとこんな感じ。
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.99377デフォルトの名無しさん
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;
}
無茶言うな。
せいぜい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) {}
};
みたいな感じで使いたいんだけどどうにかならないかな
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.16380デフォルトの名無しさん
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>の方が簡単だと思う。
2回目のTag2の定義でエラーになるということがポイント。
こうすることで、この名前空間におけるTag2の唯一性を検証できる。
>378
type erasureは型情報をplaceholderの外には出せない……と思う。
使うときに明示的に変換するか、マルチディスパッチするメソッドを用意する(>202)しかないんじゃない?
単に格納するだけだったらboost::shared_ptr<boost::any>の方が簡単だと思う。
382デフォルトの名無しさん
2011/06/02(木) 00:42:44.07383デフォルトの名無しさん
2011/06/02(木) 08:47:52.63 型消去の意味が分からない人は型消去かtype erasureでぐぐっといた方がよさげ
(この界隈限定で)割とメジャーな言葉だと思うし
(この界隈限定で)割とメジャーな言葉だと思うし
384デフォルトの名無しさん
2011/06/02(木) 20:19:53.79 >>383
1.delegateの仕組み
2.genericsのように入り口と出口だけ型を制限し、
Objectの中ではvoid*のような極端な抽象型を使う仕組み
どっちでも無いようにみえるけど具体的に何なん?
1.delegateの仕組み
2.genericsのように入り口と出口だけ型を制限し、
Objectの中ではvoid*のような極端な抽象型を使う仕組み
どっちでも無いようにみえるけど具体的に何なん?
385デフォルトの名無しさん
2011/06/02(木) 21:53:36.58 >384
2の逆。
placeholderの中では具体的な型情報を持っているけど、placeholderを管理するholderは
型情報を持たない抽象型を扱う。
boost::anyが実装例。
>382
型の特殊化を併用すれば名前の浪費は防げるね。
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の外で定義されたテンプレート引数なのか。そもそもアロケータの型を消すってのも
何を指してるのか解らんし。
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.45388デフォルトの名無しさん
2011/06/02(木) 22:44:09.90 >386
boost::any見ろって。
boost::anyにはどの型のオブジェクトでも保存できるけど、boost::anyには
保存している型の(静的な)情報が含まれない。
>386 はAdapterパターン?
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
いや、こんなの。
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には静的な情報が含まれないってのはテンプレート引数に
実体の型情報が無いって事だろ。
http://d.hatena.ne.jp/anonymouse_user/20110109/1294590115
こっからパクってきた。見れば解るがAdapterを内部で生成してる。
これをAdapterパターンというのかは知らん。
boost::anyには静的な情報が含まれないってのはテンプレート引数に
実体の型情報が無いって事だろ。
391デフォルトの名無しさん
2011/06/02(木) 23:17:07.27392デフォルトの名無しさん
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ができなくなってしまう。やっぱ無理か
コンパイル切るためにクラステンプレートからテンプレートコンストラクタにしたいんだが・・・
{
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が抜けてね?
変な所が多すぎてどう問題をとらえていいか解らん。
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に残っていたら
意味ないだろ。まあ、ソースコードが良く判らんから何とも言えんが。
そりゃムリじゃね? テンプレートコンストラクタが受け取った型情報はあくまで関数内に閉じ込められたものだし。
Aの情報はholderに閉じ込められるからtype erasureとしての価値があるわけで、Hogeに残っていたら
意味ないだろ。まあ、ソースコードが良く判らんから何とも言えんが。
395デフォルトの名無しさん
2011/06/03(金) 02:28:45.10 単にコピーコンストラクタを書きたいのなら、boost::anyのcloneあたりの実装を参考にするのが良いと思う。
あるいは型に依存した色々な処理を行いたいのなら、動的なマルチディスパッチしか無いですな。
そっちは>202参考
というか素直にvector<boost::shared_ptr<boost::any> > 使え。
あるいは型に依存した色々な処理を行いたいのなら、動的なマルチディスパッチしか無いですな。
そっちは>202参考
というか素直にvector<boost::shared_ptr<boost::any> > 使え。
396デフォルトの名無しさん
2011/06/03(金) 20:44:02.27 >>392
コードが足りなすぎてよくわからんけど、holder_を外にだせばいいだけじゃないの?
あともう一つ、コピコンで受け取ったHoge<U>をさらにholderで包むこともできんじゃないの?
ともかく正確なコードを書いてもらわんと解らん。ただし別にallocatorの規格で決まってる部分は
書かなくていいよ。手を加えたとこだけ見せてくれ。
コードが足りなすぎてよくわからんけど、holder_を外にだせばいいだけじゃないの?
あともう一つ、コピコンで受け取ったHoge<U>をさらにholderで包むこともできんじゃないの?
ともかく正確なコードを書いてもらわんと解らん。ただし別にallocatorの規格で決まってる部分は
書かなくていいよ。手を加えたとこだけ見せてくれ。
397デフォルトの名無しさん
2011/06/12(日) 18:51:32.30 ::type
↑
これウザくない?
結果が組み込み型とかになるならまだしもさ
継承とかできるならして::type書かなくていいようにすればいいじゃん
なんでみんなこんなだるい書き方するの?
↑
これウザくない?
結果が組み込み型とかになるならまだしもさ
継承とかできるならして::type書かなくていいようにすればいいじゃん
なんでみんなこんなだるい書き方するの?
398デフォルトの名無しさん
2011/06/12(日) 18:56:14.99 >>397
まずはお手本よろしく。
まずはお手本よろしく。
399デフォルトの名無しさん
2011/06/12(日) 19:33:35.74 >>373 みたいに、最後で評価するようにすればいいだろ。
まぁ、それでも1回は必要になるだろうけど。
まぁ、それでも1回は必要になるだろうけど。
400デフォルトの名無しさん
2011/06/12(日) 21:42:21.21 >>397
ちなみにそれは0xになっても型の遅延評価として残り続ける。
ちなみにそれは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 *
テンプレートエイリアスを使え
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の悲劇を繰り返す気かい。
VC6,0の悲劇を繰り返す気かい。
403デフォルトの名無しさん
2011/06/15(水) 23:33:55.05 そこでマクロですよ
404天使 ◆uL5esZLBSE
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 &)'
[引数依存の照合を使用して検出しました] の可能性があります
↓
次のコンパイルエラーが出ます。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.54template <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とすればいいだけの話なんですが。
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のバグ
413409
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)
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>&);
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に導入されてるのか?
また、複雑さを持ち込んでいるような。
そもそも、ちょっと前の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スレなり初心者スレなりにいけ
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ということか。
型変換するためにコピーコンストラクタが必要だと思った
が、クラステンプレートを実体化した後なら普通のコピー
コンストラクタでokということか。
421デフォルトの名無しさん
2011/09/10(土) 11:07:26.16 用語は正しく理解し使え。
話題にしてるのはコピーコンストラクタでなく
complex<float>からcomplex<double>への(暗黙の変換も可能な)変換コンストラクタ。
流れで通じてるからってそれに甘えるな。
話題にしてるのはコピーコンストラクタでなく
complex<float>からcomplex<double>への(暗黙の変換も可能な)変換コンストラクタ。
流れで通じてるからってそれに甘えるな。
422デフォルトの名無しさん
2011/09/10(土) 11:15:16.79 変換コンストラクターと変わらないのに、
あえてコピーコンストラクターと特別な呼び方するのってなんでだろ。
コピコン未定義だと暗黙の代入されるけどあれはしょせんC互換のコピーだし
コンストラクター書くときに、変換コンストラクターとコピコンの区別を意識した事がない。
あえてコピーコンストラクターと特別な呼び方するのってなんでだろ。
コピコン未定義だと暗黙の代入されるけどあれはしょせんC互換のコピーだし
コンストラクター書くときに、変換コンストラクターとコピコンの区別を意識した事がない。
423デフォルトの名無しさん
2011/09/10(土) 11:45:21.23424デフォルトの名無しさん
2011/09/10(土) 11:52:17.58 >>422
explicitを指定しないコンストラクターはすべて、変換コンストラクターである。
コピーコンストラクターも変換コンストラクター。
コピーコンストラクターを定義するのは、それが特別な定義を必要としているから。
例えば、ユーザー定義のコピーコンストラクターがあれば、暗黙のコピーコンストラクターは生成されないなど。
explicitを指定しないコンストラクターはすべて、変換コンストラクターである。
コピーコンストラクターも変換コンストラクター。
コピーコンストラクターを定義するのは、それが特別な定義を必要としているから。
例えば、ユーザー定義のコピーコンストラクターがあれば、暗黙のコピーコンストラクターは生成されないなど。
425デフォルトの名無しさん
2011/09/10(土) 12:00:08.50426デフォルトの名無しさん
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++が嫌われるんだ。糞が
しかし、何でこのスレというか、C++スレには「俺は何でも知ってるぞ!」
と自己主張すぎる奴が多いのかね。若気のいたりかw
規格書を読め? お前はパリサイ人か! こいつ、天狗になって職場とか
掲示板でも嫌われてるだろ。
VC++ラウンジにもそういう奴いるし。
C++の固有の決まりなんて知るか!だから、C++が嫌われるんだ。糞が
431デフォルトの名無しさん
2011/09/11(日) 19:31:28.57 >>424
いや変換コンストラクターの一種であるコピコンが存在する事がおかしいとは言ってないよ。
わざわざ同じクラスに変換する変換コンストラクターを、わざわざなんでコピコンって呼ぶのってのが疑問なんで。
いや変換コンストラクターの一種であるコピコンが存在する事がおかしいとは言ってないよ。
わざわざ同じクラスに変換する変換コンストラクターを、わざわざなんでコピコンって呼ぶのってのが疑問なんで。
432デフォルトの名無しさん
2011/09/11(日) 19:33:49.56433デフォルトの名無しさん
2011/09/11(日) 20:25:44.37 explicit指定がなくて引数をとるやつが変換コンストラクタ
非テンプレートで第1引数が自分と同じ型で第2引数以降がないか省略可能なやつがコピーコンストラクタ
コピーコンストラクタは変換コンストラクタの一種ってわけじゃなく別の概念
非テンプレートで第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 ); // 通常コンストラクタ
よくわからん。
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になって欲しい
最終的には型を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
元が組み込み型と変換不能な型は場合わけが出来るので問題ない。
浮動小数点数に変換出来る型は符号の有無が無いので多重定義で分類出来る。
整数型に変換出来る型だと整数の昇格があるので縮小変換と拡大変換が
同格になるのが問題だった。
http://codepad.org/sGDXhSYH
http://codepad.org/xhR2bnXx
438デフォルトの名無しさん
2011/09/18(日) 21:41:25.13 >>433
別にどうでもいいやん。
Aクラスから全く別のクラスBに変換するのならあってもいいが。
しかし、そんな状況はクラス設計が終わっとる
ただ、単にintからlongに変えるだけで値は変わらんでしょ。
暗黙の型変換演算子か、コンストラクタテンプレートをもっただけでしょ。
やたらと新しい概念を持ち込む「禿ども」、そしてそれを有り難がってる
「日本の馬鹿達」がうざい。
別にどうでもいいやん。
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使わずこういう使えばいいんじゃね。
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
の妥協部分にも妙案が出てくるかもしれんし
#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パラメータの順番と変数名のマッピングが崩れないようにしようとすると詰まった
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; };
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
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();}
に展開するようなイメージ。
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;
}
こんなん?
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;
}
こんなん?
449446
2011/11/14(月) 16:39:03.77450446
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;
}
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;
}
451446
2011/11/14(月) 17:04:27.39 あとは関数オブジェクトじゃなくてラムダ関数が渡せれば最高なんだけど
templateラムダ関数なんてないしなぁ…
templateラムダ関数なんてないしなぁ…
452デフォルトの名無しさん
2012/01/12(木) 00:51:25.53 struct なにかの名前_tag {};
なんて感じの使い方の共通パターンどこかにまとめられてないでしょうか
boost.MPL?
なんて感じの使い方の共通パターンどこかにまとめられてないでしょうか
boost.MPL?
453デフォルトの名無しさん
2012/01/12(木) 01:26:08.30 >>451
boost::spirit?
boost::spirit?
454デフォルトの名無しさん
2012/01/15(日) 20:40:58.27 コンパイル時のクラス識別子整数的な目的で
コンパイル時ユニークIDが欲しいのだけど可能ですか?
コンパイル時ユニーク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);
こういう関数の引数の型をなんとか自動的に特定する方法はありませんか?
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 ;
に展開したいのだけど、どう書くと実現できますか?
これを
a[0] = 0 ;
a[1] = 1 ;
// ry
a[8] = 8 ;
a[9] = 9 ;
に展開したいのだけど、どう書くと実現できますか?
458デフォルトの名無しさん
2012/02/05(日) 01:35:27.20459デフォルトの名無しさん
2012/02/14(火) 15:58:09.47 >>456
「自動的に特定」とは?
「自動的に特定」とは?
460456
2012/02/15(水) 09:14:33.77 テンプレート引数の減少というのでしょうか。
template<typename T>
void hoge(typename remove_const<T>::type &v){}
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は同じ型かどうかを表す
引数の数を増やせばある程度対応できると思ったのですが、、
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が推定できないと出ました。
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
>
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 };
};
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に限定したい。
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);
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;
}
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
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>>
おお、すげー
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の頃からいけた気もするけど。
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
略 >> 略
だろ?
だから文法だけ直しても駄目なわけ。
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」という変数名まで抽象化できたらなーと思ったのですが。
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への置き換えを
扱っているようなサイトはありませんんか?
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も基本は単純で特別なところは無いうえにあって当然のごく自然な処理だからたやすく理解できるぞ
応用になると話は変わるが基本を正しく理解できていれば一歩ずつ理解していけるだろ
テンプレートの基本を正しく理解できているなら
SFINAEも基本は単純で特別なところは無いうえにあって当然のごく自然な処理だからたやすく理解できるぞ
応用になると話は変わるが基本を正しく理解できていれば一歩ずつ理解していけるだろ
499デフォルトの名無しさん
2014/02/20(木) 18:38:49.58 SFINAEでできること全部、言語レベルでやって欲しい
500デフォルトの名無しさん
2014/02/25(火) 01:01:58.22 オーバーロード
テンプレートの特殊化
SFINAE
どれも、○○に適合するかしないか、で振り分けか・・・
テンプレートの特殊化
SFINAE
どれも、○○に適合するかしないか、で振り分けか・・・
501デフォルトの名無しさん
2014/05/24(土) 02:21:45.76ID:zaww/3E4 テンプレートメタプログラミングは最近勉強し始めたんですが
これって機能の実装中に考えるものではなくて、
一通り実装し終えてから高速化するために考えるものって解釈でいいんでしょうか?
実装しながら考えるとマジで呪文書いてるみたいに思えてわけわかんなくなるんですが
これって機能の実装中に考えるものではなくて、
一通り実装し終えてから高速化するために考えるものって解釈でいいんでしょうか?
実装しながら考えるとマジで呪文書いてるみたいに思えてわけわかんなくなるんですが
502デフォルトの名無しさん
2014/05/27(火) 12:26:09.18ID:D6t3bmO9 オレオレライブラリを作ってみると良いよ
アプリを作りながら覚えるようなものではないと思う
アプリを作りながら覚えるようなものではないと思う
503デフォルトの名無しさん
2014/08/04(月) 01:25:36.54ID:380FSYFH テンプレートメタプログラミングはプログラマブルマクロですか?
504デフォルトの名無しさん
2014/08/08(金) 10:40:48.66ID:la99q2hi 擬似関数言語と言われているようです。
505デフォルトの名無しさん
2014/10/11(土) 15:22:54.39ID:BtCnKocW constexprを使うとだいぶ楽になる
再帰は免れないけど
再帰は免れないけど
506デフォルトの名無しさん
2014/10/17(金) 00:45:58.06ID:Hi4Jootu constexprだと最適化で再帰が平文化されて深度気にしなくていいって聞いたことあるんだけど本当?
507デフォルトの名無しさん
2014/10/17(金) 02:10:59.46ID:cTCCghlL んなわきゃない
再帰->ループの最適化が可能ならconstexprとは関係なくされるし
ループに変換できないならコンパイル時計算であっても再帰で処理されるから限界はある
再帰->ループの最適化が可能ならconstexprとは関係なくされるし
ループに変換できないならコンパイル時計算であっても再帰で処理されるから限界はある
508デフォルトの名無しさん
2014/10/18(土) 09:29:03.19ID:tA+rY70l 実行時に再帰の深さでスタックオーバーフローになることがない、という質問ならその通り。
509デフォルトの名無しさん
2014/10/18(土) 17:22:23.43ID:V1Tek8sR >>507-508
ありがとう、すっきりした
ありがとう、すっきりした
510デフォルトの名無しさん
2015/03/02(月) 23:56:25.01ID:1xZgmfYC C#のようにダイナミックなメタプログラミングも面白いと思うんだがC++じゃ難しいかな
メタ属性の自動生成的なTMPテクニックは無いものか
メタ属性の自動生成的なTMPテクニックは無いものか
511デフォルトの名無しさん
2015/03/03(火) 08:45:07.32ID:7SMPCxJs そういうライブラリ書いて使えば。
512デフォルトの名無しさん
2015/03/16(月) 00:43:32.44ID: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;
って書いているのと同じですよね
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.63ID:LJL5ftmA メタプログラミングなんてコンパイル時に決定していなければならないのでほとんどの場合使い物になりません。
2つの数字を足してますが、コンパイル時に2数は2と3で無ければいけません。
ユーザに入力してもらう場合は使えないので、実用性はありませんよ
2つの数字を足してますが、コンパイル時に2数は2と3で無ければいけません。
ユーザに入力してもらう場合は使えないので、実用性はありませんよ
514デフォルトの名無しさん
2015/03/18(水) 22:54:42.95ID:Zu9d/Gpg ダイナミックなメタプログラミングのが便利だよな
515デフォルトの名無しさん
2015/03/18(水) 23:26:06.70ID:9CBewuhX テンプレートメタプログラミングは、コンパイル時に「型」を計算させるもの
516デフォルトの名無しさん
2015/03/18(水) 23:34:14.57ID:LJL5ftmA 型なんて計算しなくても決定してるじゃんw
517デフォルトの名無しさん
2015/03/19(木) 00:05:57.78ID:V7Lax8Bn .NETのジェネリックがバランスいい
518デフォルトの名無しさん
2015/03/21(土) 22:45:18.22ID: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は呼び出し分不利だと
思うのですがどうなんでしょうか?
大きいほうを返却するマクロとテンプレート
#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.78ID:573iYXRM パフォーマンスを気にするなら出力されたアセンブラを見て検討する。
最適化がどの程度かというのは処理系やバージョンによって違うから、TMPのスレで話すような話題ではない。
パフォーマンスとは別に、マクロと違って
OOKIINOHADOCCHIDAT(i++,--j)
とか
OOKIINOHADOCCHIDAT( 0 || 1, 2 )
とかやっても見えない副作用が無い。
ところでここはメタプログラミングのスレなんで、次からは初心者質問のスレで質問してね。誘導されてから個別のスレでね。
最適化がどの程度かというのは処理系やバージョンによって違うから、TMPのスレで話すような話題ではない。
パフォーマンスとは別に、マクロと違って
OOKIINOHADOCCHIDAT(i++,--j)
とか
OOKIINOHADOCCHIDAT( 0 || 1, 2 )
とかやっても見えない副作用が無い。
ところでここはメタプログラミングのスレなんで、次からは初心者質問のスレで質問してね。誘導されてから個別のスレでね。
520デフォルトの名無しさん
2015/03/22(日) 23:21:32.87ID:ljCp5GrR テンプレートなんてハッカーが作ったもの以外は使えないだろ
だいたい、どんな型でも良いようなことなんて実際のプログラムでひつようなことなんてほとんどない
設計時に決めてしまっているため、コンピュータサイエンスを研究している学者かハッカーくらいしか
自作することは無い
だいたい、どんな型でも良いようなことなんて実際のプログラムでひつようなことなんてほとんどない
設計時に決めてしまっているため、コンピュータサイエンスを研究している学者かハッカーくらいしか
自作することは無い
521デフォルトの名無しさん
2015/03/23(月) 01:45:25.88ID:1fiK6OPe メタプログラミングに興味が出たらまた来てね。
522デフォルトの名無しさん
2015/03/23(月) 12:50:41.60ID:kZkGZazg >>520
世の中には静的ポリモーフィズムと言う考え方もあるんだお。
世の中には静的ポリモーフィズムと言う考え方もあるんだお。
523デフォルトの名無しさん
2015/03/23(月) 22:22:13.71ID:k4Iv9Yid テンプレートはモジュール化出来ないから不便
524デフォルトの名無しさん
2015/03/23(月) 22:35:24.46ID:GCGYLNCS モジュール化する理由は?
525デフォルトの名無しさん
2015/03/23(月) 23:43:51.12ID:1fiK6OPe モジュール化は問題なくできるだろ。
モジュールとかパッケージに対する観念がカチカチの柔軟性のない頑固頭だからそういう話になる。
また、テンプレート一般の話なら C++ スレでやりたまえ。
背伸びしないで、メタプログラミングに興味が出てからまたきたまえ。
モジュールとかパッケージに対する観念がカチカチの柔軟性のない頑固頭だからそういう話になる。
また、テンプレート一般の話なら C++ スレでやりたまえ。
背伸びしないで、メタプログラミングに興味が出てからまたきたまえ。
526デフォルトの名無しさん
2015/03/24(火) 00:23:59.38ID:mo5/BctE 背伸びして、メタボ?
イミフ
イミフ
527デフォルトの名無しさん
2015/03/24(火) 00:39:45.62ID:SJvrs7Lk めたpろはやり尽くした結果余計でレガシーな洗練されてないダサい技術と確信した
528デフォルトの名無しさん
2015/03/24(火) 08:05:14.09ID:PUWZ5d3i TMPって略称は市民権得てますか?
529デフォルトの名無しさん
2015/03/24(火) 08:08:40.57ID:PUWZ5d3i >>504
じゃあ関数型言語が当たり前にやってきたことを今更取り入れてるんですか? 遅れってる〜
じゃあ関数型言語が当たり前にやってきたことを今更取り入れてるんですか? 遅れってる〜
530デフォルトの名無しさん
2015/03/24(火) 20:28:20.19ID:mo5/BctE メタプログラミングってコンパイル時に定数でなきゃいけないんですよね?
よく例として階乗が出されるが
int n = factorial(3);
でしか使えないんですよね
それだったらコンパイル時に計算なんてせずに
int n = 6;
と書いてけば、コンパイル時間も短縮できるからなんの意味があるのかさっぱりわからん
よく例として階乗が出されるが
int n = factorial(3);
でしか使えないんですよね
それだったらコンパイル時に計算なんてせずに
int n = 6;
と書いてけば、コンパイル時間も短縮できるからなんの意味があるのかさっぱりわからん
531デフォルトの名無しさん
2015/03/25(水) 00:14:10.62ID:sC+pepL9 >>530
その「3」を、コンパイル時に自由に設定可能にしたい時、毎回結果を人間が計算するとかありえないだろ…
その「3」を、コンパイル時に自由に設定可能にしたい時、毎回結果を人間が計算するとかありえないだろ…
532デフォルトの名無しさん
2015/03/25(水) 00:31:47.02ID:1YXCDFuZ プログラムから計算結果をコードにして吐き出す方が速くて柔軟で理解しやすいよ
TMPはゴミ
TMPはゴミ
533デフォルトの名無しさん
2015/03/25(水) 00:50:49.93ID:KfwtEOZY534デフォルトの名無しさん
2015/03/25(水) 01:43:20.22ID:sC+pepL9 >>533
うーん、毎回計算したいなら、すればとしか言いようがない。
人間が計算するのはバグの元なのは周知の事実だと思うが、そこは理解してもらえない?
それから、コンパイル時に変更する値というのはかなりあるよ。
開発したことないのかな?
うーん、毎回計算したいなら、すればとしか言いようがない。
人間が計算するのはバグの元なのは周知の事実だと思うが、そこは理解してもらえない?
それから、コンパイル時に変更する値というのはかなりあるよ。
開発したことないのかな?
535デフォルトの名無しさん
2015/03/25(水) 02:30:41.03ID:OtL+LsbQ >>530
コメントには 3! とか factorial(3) とか書くんだろ?
ならコードにそのまま書いてあるのが意図をスムーズに伝える読みやすいコードと言えるだろう。
そこでテンプレートを使うべきかどうかは別の問題だが、君の例はコンパイル時計算に拘る必要がないことを示す例としては不適切だ。
コメントには 3! とか factorial(3) とか書くんだろ?
ならコードにそのまま書いてあるのが意図をスムーズに伝える読みやすいコードと言えるだろう。
そこでテンプレートを使うべきかどうかは別の問題だが、君の例はコンパイル時計算に拘る必要がないことを示す例としては不適切だ。
536デフォルトの名無しさん
2015/03/26(木) 11:11:30.93ID:GXztcScs >>534
コンパイル時に変更するなら結果もいっしょに変更してしまえといってるだけ
人間が計算するのはバグの元なのは周知の事実であれば
int n = 1 + 2;
もNGですか?
int n = 3;
じゃだめですか?
コンパイル時に変更するなら結果もいっしょに変更してしまえといってるだけ
人間が計算するのはバグの元なのは周知の事実であれば
int n = 1 + 2;
もNGですか?
int n = 3;
じゃだめですか?
537デフォルトの名無しさん
2015/03/27(金) 00:48:21.76ID:a/NfPwWW538デフォルトの名無しさん
2015/03/28(土) 09:00:56.00ID:SDORTR7x コイツみたいなのがバラまいたマジックナンバーだらけのコードは引き継ぎたくねぇな…。
539デフォルトの名無しさん
2015/03/28(土) 09:05:21.23ID:INa8PmT6 保守するやつなんかどうでも良いし
過酷な条件で下請けを虐める連中もどうでも良い
仕様を満たす中で最も保守性の悪いコードを書くよ
過酷な条件で下請けを虐める連中もどうでも良い
仕様を満たす中で最も保守性の悪いコードを書くよ
540デフォルトの名無しさん
2015/03/28(土) 12:43:42.52ID:Ruzh6H/h541デフォルトの名無しさん
2015/03/28(土) 20:26:34.07ID:mK/cxwKs542デフォルトの名無しさん
2015/03/28(土) 21:00:18.20ID:Ruzh6H/h int n = 6; // 3の階乗
とどう違うの?
こちらのほうがコンパイル時間が短い分だけよくね?
結果が分かっているものをコンパイル時に計算するって無駄ですよね
とどう違うの?
こちらのほうがコンパイル時間が短い分だけよくね?
結果が分かっているものをコンパイル時に計算するって無駄ですよね
543デフォルトの名無しさん
2015/03/28(土) 21:56:15.36ID:V1hOllOl meta factorial なんか例に挙げるから明後日の方向に話が進むんだよ
544デフォルトの名無しさん
2015/03/28(土) 23:14:01.94ID:Yd74aMwf545デフォルトの名無しさん
2015/03/28(土) 23:35:09.90ID:Ruzh6H/h コンパイル時に決定してるいることなんてほとんど無いでしょ?
たとえばテキストエディタで決まったファイルネームで且、中身の決まったものしか
読めないテキストエディタなんてだれが使うの?
開くファイルはコンパイル時には決定できませんよね
たとえばテキストエディタで決まったファイルネームで且、中身の決まったものしか
読めないテキストエディタなんてだれが使うの?
開くファイルはコンパイル時には決定できませんよね
546デフォルトの名無しさん
2015/03/28(土) 23:50:02.28ID:m4j2ohKe >>545
TMPでアプリケーション書こうとするから話がおかしくなるんだよ
enable_ifみたいに型を引数に取って、型を返すメタ関数があると、ライブラリ書くときにすげぇ便利なんだ
型はコンパイル時に決定されるものだからね
TMPでアプリケーション書こうとするから話がおかしくなるんだよ
enable_ifみたいに型を引数に取って、型を返すメタ関数があると、ライブラリ書くときにすげぇ便利なんだ
型はコンパイル時に決定されるものだからね
547デフォルトの名無しさん
2015/03/29(日) 00:06:01.07ID:GiWz43mQ 型計算しなきゃならない時点で設計ミスだからね
TMPに甘えないで設計力を身につけなさい
メタプログラミングは言語依存度高いから慣れきってしまうと他の言語を使う時に困るよ
TMPに甘えないで設計力を身につけなさい
メタプログラミングは言語依存度高いから慣れきってしまうと他の言語を使う時に困るよ
548デフォルトの名無しさん
2015/03/29(日) 00:10:58.25ID:M18I0Bq+ 型なんてそんなころころ変わる?
549デフォルトの名無しさん
2015/03/29(日) 00:50:26.32ID:YISrMA6X 不特定多数が利用するテンプレートライブラリの場合だと、
ライブラリの利用者ごとに違う型で使われる可能性があるから、
ライブラリ視点で見ると型がころころ変わるね
ライブラリの利用者ごとに違う型で使われる可能性があるから、
ライブラリ視点で見ると型がころころ変わるね
550デフォルトの名無しさん
2015/03/29(日) 01:09:19.30ID:XfQU9N1R 設計力(笑)
そんなやつがわざわざC++使っておいて無駄だらけの非効率的なコードを書くんだろうな
そんなやつがわざわざC++使っておいて無駄だらけの非効率的なコードを書くんだろうな
551デフォルトの名無しさん
2015/03/29(日) 01:49:10.02ID:M18I0Bq+ templateってstlやboostを作ってるようなハッカー達が書いたものなら安心して使えるが、
正直その辺の連中が書いたようなものなんて全く信用できなくね?
っていうか、会社では禁止されてる。
stlやboostは使用OK
正直その辺の連中が書いたようなものなんて全く信用できなくね?
っていうか、会社では禁止されてる。
stlやboostは使用OK
552デフォルトの名無しさん
2015/03/29(日) 01:51:54.80ID:rnF3PLWy Makefile使えばplain Cでできるじゃんよ
553デフォルトの名無しさん
2015/03/29(日) 09:42:26.60ID:foFOOypx554デフォルトの名無しさん
2015/03/29(日) 10:10:31.27ID:SE+Q5kVo555デフォルトの名無しさん
2015/03/29(日) 17:12:30.32ID:M18I0Bq+ 利用者が多くてテストされてるから信用されるわけではない
信用されてるから利用者が多い
信用されてるから利用者が多い
556デフォルトの名無しさん
2015/03/29(日) 17:12:54.98ID:M18I0Bq+ しよくテストされるってだけ
557デフォルトの名無しさん
2015/03/29(日) 21:06:30.68ID:A7/HaQrx 職場のレベルが低いとかの話はマ板で。
558デフォルトの名無しさん
2015/03/30(月) 21:05:29.90ID:Z/xNzUYF コンパイル時に決定してることってあるの?
そういったプログラムだとATMなら決まった暗証番号で決まった金額しか入出金できないの?
そういったプログラムだとATMなら決まった暗証番号で決まった金額しか入出金できないの?
559デフォルトの名無しさん
2015/03/31(火) 11:25:50.97ID:SR8IVGNS 初心者質問スレで聞いてくれ。
560デフォルトの名無しさん
2015/04/03(金) 21:09:27.68ID:6jSxnujl TMPは要するにmake前に./configureしてるようなもんだろ
TMPでソースコードを自動生成して、直後にコンパイルするんだよ
感覚掴めた?
TMPでソースコードを自動生成して、直後にコンパイルするんだよ
感覚掴めた?
561デフォルトの名無しさん
2015/04/03(金) 21:31:20.03ID:Jz/BH8fu メタプログラミングのメリットが感じられん
コンパイル時に決定していることなんてごく僅かじゃん
コンパイル時に決定していることなんてごく僅かじゃん
562デフォルトの名無しさん
2015/04/03(金) 22:58:23.62ID:9Ub7Yndn563デフォルトの名無しさん
2015/04/03(金) 23:16:46.72ID:1fmbbdAS コンパイル時しか使えないのはまだ許せるが実装手段が汚いのがなぁ
拡張して美しいメタプログラミングができるようにすればいいのに
拡張して美しいメタプログラミングができるようにすればいいのに
564デフォルトの名無しさん
2015/04/08(水) 23:35:19.71ID:rJ1QxPv7 03コンパイラでdecltypeと同等の機能を実装する事は出来ないのかい?
関数合成とかしたいけど返り値の型計算が出来ない…
関数合成とかしたいけど返り値の型計算が出来ない…
565デフォルトの名無しさん
2015/04/15(水) 22:26:16.45ID:MncDCMB0 テンプレート使えばできるよ
566デフォルトの名無しさん
2015/05/17(日) 21:20:10.02ID:hki7XweT 上級者がすなるTMPといふものを、俺もしてみむとてするなり
先ずはテンプレートテクニックとかいうのを買えばいいんだろう?
先ずはテンプレートテクニックとかいうのを買えばいいんだろう?
567デフォルトの名無しさん
2015/05/17(日) 23:07:33.84ID:z/t+/yPf568デフォルトの名無しさん
2015/05/18(月) 00:38:25.36ID:owFvwpuo TMPは完全なお遊びだよ
まともな現場じゃ禁止されてるのが当たり前なぐらい保守とテストが難しい
そして設計がまともならそもそもTMPに出番はない
勉強する価値はないよ
まともな現場じゃ禁止されてるのが当たり前なぐらい保守とテストが難しい
そして設計がまともならそもそもTMPに出番はない
勉強する価値はないよ
569デフォルトの名無しさん
2015/06/01(月) 20:13:46.23ID:EdWu5WFj そりゃそうだろ
どんな型でもいい状況が、あるわけがない
コーディングする前に、データ構造はすべて決定してるからな
どんな型でもいい状況が、あるわけがない
コーディングする前に、データ構造はすべて決定してるからな
570デフォルトの名無しさん
2015/06/02(火) 12:01:40.09ID:XuwdyuF/ ……。
型以外全く同じコードが現れるのがそんなに珍しいか?
型以外全く同じコードが現れるのがそんなに珍しいか?
571デフォルトの名無しさん
2015/06/02(火) 21:53:21.20ID:76ch2Gai あ、バカだ
572デフォルトの名無しさん
2015/06/05(金) 14:46:38.01ID:PPi1ASxW そして設計がまともならそもそもTMPに出番はない
的を射てるな
どんな方でも入れるような大衆店なんて嫌だな
的を射てるな
どんな方でも入れるような大衆店なんて嫌だな
573デフォルトの名無しさん
2015/07/28(火) 03:45:09.04ID:RBpFIWq5 つまり設計をまともにすることが難しいんですね!
574デフォルトの名無しさん
2015/10/07(水) 03:28:01.75ID:VZ1ed0FI 話題ないんですか?
575デフォルトの名無しさん
2015/10/08(木) 21:19:43.12ID:WVmCtEXX (スレが落ちることを気にして無理にレスする必要は)ないです
576デフォルトの名無しさん
2015/10/23(金) 18:41:27.86ID:QTSI3RkV 話題ないんですか?
577デフォルトの名無しさん
2015/11/07(土) 19:21:52.86ID:t6CLGU5E578デフォルトの名無しさん
2015/11/07(土) 22:12:06.33ID:h8n1eFAC クソ!趣味や楽しみの範疇を出ないじゃないか!
579デフォルトの名無しさん
2016/01/07(木) 05:07:09.12ID:GSZcF0Qy 話題ないんですか?
580デフォルトの名無しさん
2016/03/29(火) 09:07:55.24ID:/c8bAcK4 サッカーブッシュ日本代表日程ぷあたん(しゅっちょうまいくろ教育長交代)春文執行40代売上差額シュガーチョコ
https://www.youtube.com/watch?v=NDq1QoJY0nY宇ドナルドアナリストパワーストーンコーチングとしまえん
サッカーブッシュ日本代表日程古本屋よしたけしゅっちょうちょこしゅがー
ディーラー税務署天才開発者死亡詰みヨミドクターマイクロサービス不足
サッカーブッシュ日本代表日程ぷあたんシフト光金さかい強制バイト人権侵害問題
春分資源執行ニューヨーク低原価ぼったステーキソルトレイク福岡横浜新橋奴隷課金パチシフト強制バイト問題新潟米センター生残
コスメ24チャリティー隠れ40代生活保護プレイボーイバイトレードいたりあん接待問題
マスコミKARDローンケーオーサービス不足婚活パーティー寄付金執行原発ビジネス
FBIチャイニーズタイホテル売上事務所ガチャ決算ガチャキャンペーン(販売報道陣過激派組織向携帯最新情報提供終了
校長発言細心注意ノートン産廃エラー(著作権クレーム中国反応融資高額教育費)(中国捕鯨団体40代社員サッカーコメント
高額入学金ヤフウ新橋大学ヤフウ新橋理事長FX経費 おじや50代資産ガリバズフィード40代エリート
https://www.youtube.com/watch?v=NDq1QoJY0nY宇ドナルドアナリストパワーストーンコーチングとしまえん
サッカーブッシュ日本代表日程古本屋よしたけしゅっちょうちょこしゅがー
ディーラー税務署天才開発者死亡詰みヨミドクターマイクロサービス不足
サッカーブッシュ日本代表日程ぷあたんシフト光金さかい強制バイト人権侵害問題
春分資源執行ニューヨーク低原価ぼったステーキソルトレイク福岡横浜新橋奴隷課金パチシフト強制バイト問題新潟米センター生残
コスメ24チャリティー隠れ40代生活保護プレイボーイバイトレードいたりあん接待問題
マスコミKARDローンケーオーサービス不足婚活パーティー寄付金執行原発ビジネス
FBIチャイニーズタイホテル売上事務所ガチャ決算ガチャキャンペーン(販売報道陣過激派組織向携帯最新情報提供終了
校長発言細心注意ノートン産廃エラー(著作権クレーム中国反応融資高額教育費)(中国捕鯨団体40代社員サッカーコメント
高額入学金ヤフウ新橋大学ヤフウ新橋理事長FX経費 おじや50代資産ガリバズフィード40代エリート
581デフォルトの名無しさん
2016/04/24(日) 03:46:29.95ID:PmTKsIVl どんな型でも扱えることが必要になることなんてありますか?
設計が終わった時には、すべて型なんて決まってるからな
設計が終わった時には、すべて型なんて決まってるからな
582デフォルトの名無しさん
2016/04/24(日) 10:35:05.32ID:IhUvQdoq ライブラリにはだいたい必要だよ。
ライブラリの利用者がどんな型を必要とするかなんて、ライブラリの作者は知らないから。
ライブラリの利用者がどんな型を必要とするかなんて、ライブラリの作者は知らないから。
583デフォルトの名無しさん
2016/04/24(日) 14:06:44.93ID:Inhm7+j0 >>581
型以外全く同じコードを沢山書きたいなら俺らは止めたりしないよ。
型以外全く同じコードを沢山書きたいなら俺らは止めたりしないよ。
584デフォルトの名無しさん
2016/04/24(日) 15:31:01.95ID:cfBCsOMn >>583
なんのデメリットがあるの?
なんのデメリットがあるの?
585デフォルトの名無しさん
2016/04/25(月) 01:41:28.12ID:ZFUQDfs5 STLやboostなら使えるが、素人が書いたtemplateなんて使いものにならないな
禁止されてる理由がわかる
禁止されてる理由がわかる
586デフォルトの名無しさん
2016/04/25(月) 09:42:02.50ID:7tPDaHNy ヒープじゃなくスタックに値を持つベクトルとかで
次元数をテンプレートにしたりしてるけどな
これテンプレート引数で渡さないと壁にぶつかると思う
次元数をテンプレートにしたりしてるけどな
これテンプレート引数で渡さないと壁にぶつかると思う
587デフォルトの名無しさん
2016/05/02(月) 19:27:51.75ID:XHrH2XI+ そんなナイーブな理解の人に一々返事してあげるなんて賢者かって…
588デフォルトの名無しさん
2016/05/30(月) 02:44:46.97ID:Wv9Vl7oG このスレの進み具合から、TMPの意味がやっと分かったよ
589デフォルトの名無しさん
2016/06/22(水) 18:35:49.27ID:/RajI6Sy 実際に使われてるのか?
590デフォルトの名無しさん
2016/06/23(木) 03:20:19.54ID:05qDBgT1 Totemo Muzukashi Programing
591デフォルトの名無しさん
2016/06/23(木) 09:40:20.91ID:7EyqyniW 頭の体操的な目的には割と良いと思う
TMPをそれなりに嗜んでおけば他の言語が楽に感じる
TMPをそれなりに嗜んでおけば他の言語が楽に感じる
592デフォルトの名無しさん
2016/07/14(木) 00:08:17.53ID:NnRKTyQ9 定数式中の&&がショートサーキットしてくれなくて
ムンクの叫びになりかけたんだが、よく考えたら当たり前だよな……
ムンクの叫びになりかけたんだが、よく考えたら当たり前だよな……
593デフォルトの名無しさん
2016/07/30(土) 18:04:44.54ID:qgpylzNJ TMPなんて必要になったことがない、コンパイル時に決定してることなんてあるか?
階乗の計算でTMPでコンパイラに計算させなくても、ハードコーディングでいいじゃん
階乗の計算でTMPでコンパイラに計算させなくても、ハードコーディングでいいじゃん
594デフォルトの名無しさん
2016/07/30(土) 18:32:50.81ID:WLIyTwaV595デフォルトの名無しさん
2016/07/30(土) 18:38:48.24ID:B4kFV2/L ハードコーディングを手軽にするシステムだろ
596デフォルトの名無しさん
2016/07/30(土) 19:19:37.95ID:qgpylzNJ >>594
3の階乗なら6とタイプするほうが早いだろ
3の階乗なら6とタイプするほうが早いだろ
597デフォルトの名無しさん
2016/07/30(土) 19:27:27.17ID:WLIyTwaV >>596
いや、3とタイプする方が速いが?
いや、3とタイプする方が速いが?
598デフォルトの名無しさん
2016/07/30(土) 19:32:38.39ID:qgpylzNJ >>597
コードは?
コードは?
599デフォルトの名無しさん
2016/07/30(土) 19:48:50.85ID:WLIyTwaV >>598
コード生成コストはイニシャルコストと考えれば、0とみなせますが?
コード生成コストはイニシャルコストと考えれば、0とみなせますが?
600デフォルトの名無しさん
2016/07/30(土) 19:51:53.60ID:B4kFV2/L TMP嫌ってる奴は関数型言語にアレルギーおこしてそう
601デフォルトの名無しさん
2016/07/30(土) 20:01:44.92ID:hqfCLm5M TMP否定派の人って数値計算にしか使えないと思ってるの
602デフォルトの名無しさん
2016/07/30(土) 20:03:27.36ID:qgpylzNJ 数値計算なんて使い物にならんだろう
入力はコンパイル時に決定してる必要があるんだからw
入力はコンパイル時に決定してる必要があるんだからw
603デフォルトの名無しさん
2016/07/30(土) 20:15:01.45ID:t+kcHL9G ちょっとミスったら訳わからんエラーの洪水が出るのは改善されたのかのぅ
604デフォルトの名無しさん
2016/07/30(土) 21:54:49.81ID:NYI5chEQ メタプロ好きな奴でまともにコードテストやってる奴に会った事ない。
605デフォルトの名無しさん
2016/07/30(土) 23:29:13.16ID:ShugxVkw テンプレートの単体テスト書くの、しんどいよねw
606デフォルトの名無しさん
2016/07/30(土) 23:34:53.81ID:WLIyTwaV >>605
わりと普通のテストでよくね?
わりと普通のテストでよくね?
607デフォルトの名無しさん
2016/07/30(土) 23:35:01.17ID:ShugxVkw608デフォルトの名無しさん
2016/07/30(土) 23:38:54.87ID:ShugxVkw609デフォルトの名無しさん
2016/07/30(土) 23:47:29.00ID:ShugxVkw でも実際、ビジネスでTMP使う機会なんてそんなにないよね
必要なものは大抵ライブラリで揃ってるし
ここ数年ビジネスで書いたテンプレートなんて、sortやmapに渡す
比較ファンクタくらいなもんだ
必要なものは大抵ライブラリで揃ってるし
ここ数年ビジネスで書いたテンプレートなんて、sortやmapに渡す
比較ファンクタくらいなもんだ
610デフォルトの名無しさん
2016/07/31(日) 00:52:52.61ID:BwQhep53 >>609
確かにね。
確かにね。
611デフォルトの名無しさん
2016/07/31(日) 01:15:49.72ID:xYHlZVXv ビジネスwww
612デフォルトの名無しさん
2016/08/04(木) 21:55:02.63ID:bUkZS3Tk >>603
具体的にどんな? 「オーバーロードが見つからない」とか「候補は:」とかいう奴?
具体的にどんな? 「オーバーロードが見つからない」とか「候補は:」とかいう奴?
613デフォルトの名無しさん
2016/10/22(土) 12:48:36.20ID:gXZrk0GL このスレの伸びなさがTMPの必要性を考えさせるな〜
614片山博文MZ ◆T6xkBnTXz7B0
2016/10/25(火) 13:36:18.47ID:tNFHqmMD https://teratail.com/questions/52686
助けて下さい!!!
助けて下さい!!!
615デフォルトの名無しさん
2016/10/25(火) 15:45:43.97ID:htPnqAhC バグったコンパイラを捨てろ
616デフォルトの名無しさん
2016/10/30(日) 14:57:03.72ID:O4GwQcVb618デフォルトの名無しさん
2016/10/30(日) 16:29:00.54ID:O4GwQcVb 助けてくれた人に感謝しろよ
今後、偉そうにもの抜かすなよ、
今後、偉そうにもの抜かすなよ、
619デフォルトの名無しさん
2016/11/11(金) 01:17:57.70ID:EDumE7xv template<class T>
void foo(T t){
typedef T::valuetype tt;
//以下略
}
みたいな関数なにがしたいのかな
templateっていろんな型を代表できるのに
上記だと
Tがvaluetypeをもっていないとコンパイルできないじゃん
fooにintなんて渡せない
void foo(T t){
typedef T::valuetype tt;
//以下略
}
みたいな関数なにがしたいのかな
templateっていろんな型を代表できるのに
上記だと
Tがvaluetypeをもっていないとコンパイルできないじゃん
fooにintなんて渡せない
620デフォルトの名無しさん
2016/11/11(金) 02:50:18.52ID:R5aqtocD621デフォルトの名無しさん
2016/11/11(金) 03:38:29.50ID:CB2qWRAJ >>619
コンパイルできないようにしてるんだよ…
コンパイルできないようにしてるんだよ…
622デフォルトの名無しさん
2016/11/11(金) 03:54:15.76ID:cKP8rFBJ value_typeだろバカ
623デフォルトの名無しさん
2016/11/11(金) 09:56:45.58 インターフェースみたいなものやね
624デフォルトの名無しさん
2016/11/11(金) 20:08:41.83ID:DxFrXdPz625デフォルトの名無しさん
2016/11/13(日) 20:49:57.87ID:NMmsi9ae626デフォルトの名無しさん
2016/11/13(日) 23:13:56.74ID:01e71bgy Tが何を受け付けるかわからん関数を使うんか?
627デフォルトの名無しさん
2016/11/13(日) 23:57:09.90ID:Ggvvb/9+ >>625
仕様を理解しないで使っちゃう人のために、コンパイルエラーにしてるんだよ。
仕様を理解しないで使っちゃう人のために、コンパイルエラーにしてるんだよ。
628デフォルトの名無しさん
2016/11/14(月) 00:03:42.34ID:Ndr4XdNg >>626
うけとる型が決まってるなら、templateにする理由って?
うけとる型が決まってるなら、templateにする理由って?
629デフォルトの名無しさん
2016/11/14(月) 00:19:36.49ID:8AzCWpe2 きみはgenericの汎用性を、あらゆる、という意味と履き違えている。
逆に全ての型に対して使える関数って役に立つの? 意味あるの?
関数の想定している要件を満たすT全てじゃ意味ないの?
逆に全ての型に対して使える関数って役に立つの? 意味あるの?
関数の想定している要件を満たすT全てじゃ意味ないの?
630デフォルトの名無しさん
2016/11/14(月) 00:32:58.25ID:BtUwB/sO631デフォルトの名無しさん
2016/11/14(月) 01:42:04.43ID:V+VrG6L9 >>629
その要件を満たすTをどうやって知ることができるんだ?
その要件を満たすTをどうやって知ることができるんだ?
632デフォルトの名無しさん
2016/11/14(月) 01:55:47.75ID:esjkHDa1 Java, C#の型制約と同じだろ
Haxe なら、
class A<T : (B, C)> { }
Tには、B, 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.84ID:8AzCWpe2 >>631
その関数のドキュメントなければコードを読む
その関数のドキュメントなければコードを読む
635デフォルトの名無しさん
2016/11/14(月) 07:57:34.62ID:cdoyRzEZ >>632
それならまだいい、関数本体のコードを読まなくても、宣言部だけで利用者はTに必要な要件がわかる。
それならまだいい、関数本体のコードを読まなくても、宣言部だけで利用者はTに必要な要件がわかる。
636デフォルトの名無しさん
2016/11/14(月) 12:21:25.14ID:7/YTvzPd 宣言部だけで関数の挙動がわかる世界でやってくれ
637デフォルトの名無しさん
2016/11/14(月) 20:38:01.70ID:xIkiXoiE >>636
ソースが公開されてない、win32apiは宣言しかわからないよ、それでも十分に宣言を見ればわかる。
ソースが公開されてない、win32apiは宣言しかわからないよ、それでも十分に宣言を見ればわかる。
638デフォルトの名無しさん
2016/11/14(月) 22:02:59.08ID:PAYFoA/x すごいねー
俺はMSDN見ないとフラグの意味とかわからないわー
俺はMSDN見ないとフラグの意味とかわからないわー
639デフォルトの名無しさん
2016/11/14(月) 23:40:51.43ID:Ndr4XdNg そんなレベルの低い方が回答してたのか・・・
640デフォルトの名無しさん
2016/11/22(火) 02:18:26.11ID:7Mf+uR5S 特定のクラスしか受け付けないテンプレートってなんなの?テンプレートにしなくてもよくね?
641デフォルトの名無しさん
2016/11/22(火) 02:37:57.83ID:e1oIg+aV 四則演算が定義された型のみ受け付けたい場合など
642デフォルトの名無しさん
2016/11/22(火) 02:46:07.47ID:UcbrgWPr それ、特定のクラスじゃなくてインターフェイス。traits使えば幸せになれるやつ。
643デフォルトの名無しさん
2016/11/22(火) 04:43:58.53ID:e1oIg+aV てへぺろ
644デフォルトの名無しさん
2016/11/22(火) 12:51:23.77ID:OZ794KAs まあ、特定の1つのクラスしか受け付けないってのなら、確かにtemplateにする意味ないね。
特定でも2つ以上のクラスに対応してるなら、意味あると思うよ。
特定でも2つ以上のクラスに対応してるなら、意味あると思うよ。
645デフォルトの名無しさん
2016/11/22(火) 14:30:10.04ID:uKd48bt3 参照やポインタじゃなくて値型で扱いたいのかもしれない
646はちみつ餃子 ◆8X2XSCHEME
2017/06/20(火) 02:21:52.34ID:3gaQOia7647デフォルトの名無しさん
2017/10/30(月) 12:57:38.90ID:6+ZnRbeq TMP!
648デフォルトの名無しさん
2018/05/23(水) 21:23:36.57ID:Au5e7VGg 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
UWGL1
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
UWGL1
649デフォルトの名無しさん
2018/07/05(木) 00:34:25.25ID:RfoszcD2 2L3
650デフォルトの名無しさん
2019/02/16(土) 01:05:08.01ID:f4GtCnpH tmpで不動少数演算ってできるの?
651デフォルトの名無しさん
2021/03/22(月) 01:51:08.09ID:4Yc/PXPF いまいちtmpの使い道がわからん
コンパイル時に決定してることしか扱えないって意味なくね?
ATMなら、人が引き出せる額を決定できないんでしょ
コンパイル時に決定してることしか扱えないって意味なくね?
ATMなら、人が引き出せる額を決定できないんでしょ
652デフォルトの名無しさん
2021/03/22(月) 03:54:42.57ID:q7gQYNZZ コンパイル時の前、設計時にさえ決まることがあるんだってな?
そう、アルゴリズムだよ!
そう、アルゴリズムだよ!
653デフォルトの名無しさん
2022/11/08(火) 16:55:32.65ID:jWjfxeNQ テンプレト。
654デフォルトの名無しさん
2022/11/23(水) 15:54:10.57ID:uPWnf15k enable_ifはもう書きたくないんや
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 《180分独占告白》不同意性交疑惑にMattが訴える「私の話も聞いてほしい」「kissやhugはご挨拶程度のスキンシップという認識」 [Ailuropoda melanoleuca★]
- 共産・志位議長、結婚・出産の奨励に反対 [少考さん★]
- 【速報】都立六本木高校で女子生徒が刺される 別の女子生徒を殺人未遂の疑いで逮捕 包丁で背中から [おっさん友の会★]
- 【🇮🇷】イラン国籍の男逮捕 公園で面識ない10代少女の胸など触り 逃げた少女を執ように追いかけわいせつ行為か [nita★]
- 史上最大規模のハッキングが発生…暗号資産取引所Binanceで約1兆円が流出 [おっさん友の会★]
- <独自>ウクライナが日本に迎撃弾供与を要望 小野寺元防衛相「難しいが知恵絞る」と回答 [煮卵★]
- 聖帝安倍晋三が所有してそうな馬 [452056903]
- トクリュウメンバーを逮捕、現役自衛隊員だった… [245325974]
- 【速報】日本国外務省が個人情報漏洩 3600件 [377482965]
- 【悲報】昭和の体罰、ヤバすぎる😰 [834922174]
- 女(14)「男子ちゃんと歌ってよ!(泣)」 → 女(20)「おちんちんをおまんこに❤入れていっぱい気持ちして❤」ヌポヌポ [509448172]
- 【悲報】旭川駐屯地の自衛官(21)、トクリュウに参加して特殊詐欺で逮捕www [834922174]