• ベストアンサー

テンプレート引数の型を実行時に知りたいのですが・・・

下記の関数 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 なら ) { } ... }

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

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の場合   } } といった具合でしょう

hhgoohh
質問者

お礼

ありがとうございます。 typeid演算子が正に求めているものでした。

その他の回答 (3)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

> が、何故「禁じ手」なのでしょうか? 型安全性が損なわれ、保守性が低下するからです。 もっと詳しく知りたいなら、「C++ Coding Standards」の「90.型switchを避け、ポリモルフィズムを使おう」を参照してください。

参考URL:
http://www.pej-hed.jp/washo/459.html
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.3

template<> class TTest<int> { }; などと、int や float に特殊化した定義を個別に与えればいいんじゃないの?

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

これはやってはいけない「禁じ手」のひとつです。 このような場合、 void f(int); void f(float); void f(double); template <class T> T TTest<T>::Func() {  ...  T arg;  f(arg);  ... } のようにするか、引数がないのであればテンプレート関数を使うようにします。

hhgoohh
質問者

補足

なるほど。 「スマート」だと思いました。が、何故「禁じ手」なのでしょうか? よろしければ教えてください。

関連するQ&A