比较If语句中的数据类型

Comparing A Data Type in an If Statement

本文关键字:数据类型 语句 If 比较      更新时间:2023-10-16

是否有方法在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和dependent在数据类型上,它将根据传入的数据类型在堆栈上创建适当的char[]变量,并将数据存储到char[]中,然后从函数中返回指针。

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

好吧,有一些方法可以使用typeid,就像这里所做的那样。使用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;
}

请参阅CPP参考资料和这个问题,了解更多关于它的讨论(以及你还能做些什么……来避免专业模板的麻烦)。C++模板专业化语法

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