- ベストアンサー
テンプレート引数の型を実行時に知りたいのですが・・・
下記の関数 Func() の if 文の部分はどのように書いたらよいのでしょうか? どうぞよろしくお願いします。 template <class T> class TTest { ... T Min(); ... }; ... template <class T> T TTest<T>::Func() { ... if( Tが int なら ) { } else if( Tが float なら ) { } else if( Tが double なら ) { } ... }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
int,double,floatの各タイプの比較用のテンプレートクラスの実体を準備して typeid演算子で比較でしょう #include <typeinfo.h> TTest<int> tInt; TTest<float> tFloat; TTest<double> tDouble; template <class T > T TTest<T>::Func() { const type_info& t1 = typeid(this); const type_info& tI = typeid(&tInt); const type_info& tF = typeid(&tFloat); const type_info& tD = typeid(&tDouble); if ( t1 == tI ) { // intの場合 } else if ( t1 == tF ) { // foatの場合 } else if ( t1 == tD ) { // doubleの場合 } } といった具合でしょう
その他の回答 (3)
- jacta
- ベストアンサー率26% (845/3158)
> が、何故「禁じ手」なのでしょうか? 型安全性が損なわれ、保守性が低下するからです。 もっと詳しく知りたいなら、「C++ Coding Standards」の「90.型switchを避け、ポリモルフィズムを使おう」を参照してください。
- koko_u_
- ベストアンサー率18% (459/2509)
template<> class TTest<int> { }; などと、int や float に特殊化した定義を個別に与えればいいんじゃないの?
- jacta
- ベストアンサー率26% (845/3158)
これはやってはいけない「禁じ手」のひとつです。 このような場合、 void f(int); void f(float); void f(double); template <class T> T TTest<T>::Func() { ... T arg; f(arg); ... } のようにするか、引数がないのであればテンプレート関数を使うようにします。
補足
なるほど。 「スマート」だと思いました。が、何故「禁じ手」なのでしょうか? よろしければ教えてください。
お礼
ありがとうございます。 typeid演算子が正に求めているものでした。