Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 比较If语句中的数据类型_C++_If Statement_Function Templates - Fatal编程技术网

C++ 比较If语句中的数据类型

C++ 比较If语句中的数据类型,c++,if-statement,function-templates,C++,If Statement,Function Templates,有没有办法在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 ) {

有没有办法在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;
}
typedef char cInt[sizeof(int)];
typedef char cFloat[sizeof(float)];
typedef char cDouble[sizeof(double)];
模板
字符*convertToCharStr(常数T&T){
如果(t==int){
cInt c=t;
返回c;
}
如果(t==浮点){
cFloat c=t;
返回c;
}
如果(t==double){
cDouble c=t;
返回c;
}
返回空ptr;
}
如您所见,我正在尝试创建一个模板函数,它可以接受任何默认数据类型,如int、unsigned int、float、double和dependent 在数据类型上,它将根据传入的数据类型在堆栈上创建适当的char[]变量,并将数据存储到char[]中,然后从函数中返回指针


我将保持原样,但需要注意的是,字符数组应该是无符号字符

好吧,有一些方法可以像这里一样使用
typeid
,但我建议使用模板专门化,如下所示:

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;
}
模板
字符*convertToCharStr(常数T&T){
//也许您觉得在这里放置静态断言更合适
返回空ptr;
}
模板
字符*convertToCharStr(常量int&t){
cInt c=t;
返回c;
}
模板
字符*convertToCharStr(常量浮点和t){
cFloat c=t;
返回c;
}
模板
字符*convertToCharStr(常数双和t){
cDouble c=t;
返回c;
}
请参阅和这个问题,了解更多关于它的讨论(以及您还可以做些什么……以避免专门模板制作的痛苦)


也就是说,在堆栈上创建一个变量,然后返回指向该变量的指针是不安全的,因为该变量在函数调用返回时将被取消堆栈,并且以后可能会被覆盖。

对于
int
s、
float
s和
double
s的内存有对齐要求,您的代码会忽略这些要求。其次,当函数返回堆栈时,其变量的内存将自动释放,并可用于将来的函数调用和其他用途。第三,您应该更喜欢重载或模板专业化,而不是在模板内部进行运行时切换。第四:返回
sizeof t
并让调用者在堆栈上保留相应的空间,或者使用堆,这样做会稍微好一点,使用
boost::variant
会更好一些,我意识到最好通过引用传入第二个参数unsigned char*,而不是返回stack char*,只要在堆上进行分配,就更有可能得到结果。还有人告诉我,我可以使用int或float等数据类型的并集和unsigned char指针,但我的目标是将该类型的各个字节分配到每个无符号字符数组索引中。