1

dynamic_cast を使用するよりもテンプレート パラメーターの型を検出するエレガントな方法はありますか。元

template< typename TypeA, typename TypeB >
bool foo( TypeA* x, TypeB* y )

if( dynamic_cast< WantedType* >( x ) != NULL ) // More ellegant way of doing this
   // found specific type, setting its stuff

おそらく特殊化ですtemplate< WantedType TypeA, ... >が、これにより、同じことを行うコードが重複することになります。

4

5 に答える 5

3

std::is_same<A,B>::valueA と B が同じ型かどうかを示します。

ただし、間違いを犯している可能性があります。

dynamic_castインスタンスの実行時型をチェックするためのものです。これは、多くのコンテキストで同じ変数のコンパイル時の型と同じではありません。

于 2012-12-20T13:38:56.110 に答える
2

これは別のオプションです。これは、元の考え方に沿っている可能性があります (それが最善の方法であるとは言いません)。

typeid()( )の方法を試してみてください#include <typeinfo>

あなたのコードを考えると、あなたはできる

if ( typeid( x ).name() == typeid( wantedType ).name() ) { ...

wantType がintcharまたは何でもあります。

編集

見てください:http://msdn.microsoft.com/en-us/library/fyf39xec%28v=vs.80%29.aspx

の引数はtypeid任意のオブジェクトにできるようです。

于 2012-12-20T13:42:23.210 に答える
1

多分特殊化テンプレート<WantedTypeTypeA、...>

オーバーロードまたはスペシャライゼーションのいずれかが間違いなく進むべき道です。他のすべてはハッキーであり、コードをより複雑にします。

しかし、これは同じことをするために重複したコードをもたらすでしょう。

理想的にはそうすべきではありません。関数を適切に分解した場合、コードの重複は最小限に抑えられます(=関数ヘッダー)。

于 2012-12-20T13:26:31.660 に答える
1

コンパイル時のチェックにテンプレートの特殊化を使用できます。

template <typename A>
class IsClassWantedType 
{
  public:
    static const bool value = false;
}

template <>
class IsClassWantedType <WantedType>
{
  public:
    static const bool value = true;
}

template< typename TypeA, typename TypeB >
bool foo( TypeA* x, TypeB* y )
{

  if( IsClassWantedType<TypeA>::value == true )
  {
    //Do Stuff
  }

}

ここにはポリモーフィズムがないことに注意してください...派生型はチェックされません。
派生型の場合は、より複雑なSFINAEトリックを使用する必要があります。

于 2012-12-20T13:32:32.283 に答える
0

typeid(t).name()まさにそれを行うために使用できます。

コード例:

#include <string>
#include <sstream>
#include <iostream>
#include <typeinfo>
using namespace std;



template <class T>
string toString(const T& t)
{
    std::stringstream ss;
    ss << t;

    cout<<"The Datatype is a "<< typeid(t).name()  <<" \n";

    return ss.str();
}



int main(void)
{

    string str;

    char c=123;
    str=toString(c );

    int i=1234;
    str=toString(i );

    double d=1234;
    str=toString(d );



  cout<<" \nPress any key to continue\n";
  cin.ignore();
  cin.get();

   return 0;
}

出力:

The Datatype is a char
The Datatype is a int
The Datatype is a double
于 2012-12-20T13:57:19.870 に答える