有没有办法在if语句中测试参数的数据类型?这是一个源代码示例:它不会编译,但它用于表达我的意图。
typedef char cInt[sizeof(int)];
typedef char cFloat[sizeof(float)];
typedef char cDouble[sizeof(double)];
template<typename T>
char* convertToCharStr( const T& t ) {
if ( t == int ) {
cInt c = t;
return c;
}
if ( t == float ) {
cFloat c = t;
return c;
}
if ( t == double ) {
cDouble c = t;
return c;
}
return nullptr;
}
正如你所看到的,我正在尝试创建一个模板函数,它可以采用任何默认数据类型,如int,unsigned int,float,double和depends 在数据类型上,它将根据传入的数据类型在堆栈上创建适当的char []变量,并将数据存储到char []中并将指针返回函数。
我将保留它的方式,但作为一个注释,字符数组应该是unsigned char。
答案 0 :(得分:7)
嗯,有typeid
使用这里Using typeid to check for template type的方法,但我建议使用模板专精化,如下所示:
template<typename T>
char* convertToCharStr( const T& t ) {
//Maybe you might feel it more appropriate to put a static assert here
return nullptr;
}
template<>
char* convertToCharStr( const int& t ) {
cInt c = t;
return c;
}
template<>
char* convertToCharStr( const float& t ) {
cFloat c = t;
return c;
}
template<>
char* convertToCharStr( const double& t ) {
cDouble c = t;
return c;
}
请参阅CPP Reference以及此问题,了解更多关于它的讨论(以及您还可以做些什么......以避免专门模板的痛苦)。 C++ templates specialization syntax
话虽如此,在堆栈上创建变量然后返回指向它的指针是不安全的,因为该函数将在函数调用返回时被取消堆栈,并且可能会在以后被覆盖。