[過去ログ]
Boostを語れゴラァ part3 (1001レス)
Boostを語れゴラァ part3 http://echo.5ch.net/test/read.cgi/tech/1158991211/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
リロード規制
です。10分ほどで解除するので、
他のブラウザ
へ避難してください。
483: デフォルトの名無しさん [sage] 2006/12/19(火) 19:52:06 すみません、質問させてください 基本型あるいはユーザ定義型の配列の要素数を返す関数を作ろうとしてるんですが arrayがユーザ定義型の配列であった場合でも /* @ */の処理がコンパイルされるためエラーになってしまいます template <typename T> void count(T array[]){ if(boost::is_pod<T>::value){/* @ */} else{/* A */}} WEBで調べているとboost::enable_ifで解決できそうな予感がしたのですが 自分には次の例がよく理解できません(特に::type*=0の部分) これはどういった理屈で動いているんでしょうか template<typename T> void copy_n( const T* from, int n, T* to, typename enable_if< is_pod<T> >::type* =0 ){/* 省略 */} http://echo.5ch.net/test/read.cgi/tech/1158991211/483
484: デフォルトの名無しさん [sage] 2006/12/19(火) 20:09:40 >>483 enable_ifやdisable_ifは、関数のオーバーロード解決のルールをトリッキーに使っている。 やりたいことを実現する方法はいくつかある。 たとえばこんな方法。 //false以外、すなわちtrueの場合に呼ばれる template < bool isPod > struct Count_impl { static void do() {/* 1 */} } ; //特殊化、falseの時に呼ばれる template < > struct Count_impl<false> { static void do() {/* 2 */} } ; template < typename T > void count(T array[]) { Count_impl<boost::is_pod<T>::value>::do() ; } http://echo.5ch.net/test/read.cgi/tech/1158991211/484
485: デフォルトの名無しさん [sage] 2006/12/19(火) 20:11:15 >>483 enable_if<is_pod<T> > には、TがPODならtypeメンバがあり、そうでなければtypeメンバがない。 したがって、TがPODでないとき、typename enable_if<is_pod<T> >::typeは 不正な型であり、SFINAE規則によってこの定義が多重定義の考慮から外される。 結果として、TがPODであるときのみ考慮される定義ができたわけだ。 typename enable_if<is_pod<T> >::typeは、このコンパイル時選択の機構のためだけに 使われているので、インタフェースに影響を与えないようにデフォルト値付きの引数になっている。 ポインタを取っているのは簡潔に0で初期化できるようにだろう。 http://echo.5ch.net/test/read.cgi/tech/1158991211/485
486: 483 [sage] 2006/12/19(火) 21:31:23 >>484,485 レス感謝です おかげさまで理解できました >>484 こういう風にすればenable_ifなしでいけるんですね なんとかそのプログラム理解はできても 自分で書けるようになるまでが大変だ・・ とりあえずこれを参考に頑張ってみます >>485 enable_if< is_pod<T> >::type* =0 ええと、この式の場合だと 組み込み型の場合はtypeメンバが存在するわけですよね そして組み込み型でない場合はtypeがないから定義自体されない それだと* =0はなくても大丈夫なんじゃ?と思ったけど この引数はコンパイル時にifの役割を果たせばよいから省略可能にしたい 省略可能にするには=とデフォルト引数が必要で typeをtype*にすればどんな場合でも0が代入できる うーむ、よく考えられてますね http://echo.5ch.net/test/read.cgi/tech/1158991211/486
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.047s