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>::value告诉你 A 和 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

也许是一个专业化模板< WantedType TypeA, ... >

重载或专业化绝对是要走的路。其他一切都是hacky,使代码更加复杂。

但这会导致重复的代码做同样的事情。

理想情况下不应该。如果您已经正确分解了函数,那么只有最少的代码重复(= 函数头)。

于 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 回答