将模板化类型与C ++中的某些类/类型进行比较

时间:2020-07-12 17:54:36

标签: c++ templates

我正试图找到传递给模板的thee类的类型

template<typename ret> 
ret copy(ret var){
    if(ret == int){ //problematic line
       cout << "int" << endl;
    }
    return var;
}

int main()
{
    int a = 5;
    auto b = copy(a);
    cout << b << endl;

    return 0;
}

但是它返回一个错误:

main.cpp: In function ‘ret copy(ret)’:
main.cpp:15:12: error: expected primary-expression before ‘==’ token
     if(ret == int){
            ^~
main.cpp:15:15: error: expected primary-expression before ‘int’
     if(ret == int){
               ^~~
main.cpp:15:15: error: expected ‘)’ before ‘int’

如何正确执行此操作?谢谢

2 个答案:

答案 0 :(得分:4)

与python不同,在C ++中,int不是class类型的对象(或类似的东西)。您无法像那样进行比较。相反,您可以使用

template<typename ret> 
ret copy(ret var)
{
    if constexpr(std::is_same_v<ret, int>)
    {
        std::cout << "int\n";
    }
    // and so on....

编辑 :(针对yaodav的评论)

请注意,if constexpr仅受C ++ 17支持。有其他选择,例如:

    if (std::is_same<ret, int>::value)
    {
        std::cout << "int\n";
    }

但是缺点是,如果需要对var做更复杂的事情,例如var * 2,那么对于{{1 }}。 ret语法不易受此类错误的影响,因为当std::vector<int>为假时,它不会尝试编译代码(它仅进行基本解析以查找最后一个if constexpr

如果需要较旧的C ++版本,则唯一可行的选择是重载:

if constexpr

还要注意(yaodav的另一条评论),使用这样的}构造是不良设计的标志。总的来说,我更喜欢根据属性和功能而不是特定的类型来对事物进行条件处理(而我上面的重载示例条件太狭窄了)。例如,如果我需要一个整数类型(带有+,-,*,/等),那么我宁愿根据这些功能的存在来对代码进行条件处理。

答案 1 :(得分:2)

如评论中所述,像这样的显式类型检查通常是一个糟糕的设计。您可以阅读有关模板元编程和专业化的信息,以更好地解决您的问题。

如果可以使用运行时类型信息,则可以采用以下解决方法:

#include <iostream>
#include <typeinfo>

template<typename ret>
ret copy(ret var){
    if(typeid(var) == typeid(int)){
       std::cout << "int" << std::endl;
    }
    return var;
}

int main()
{
    int a = 5;
    auto b = copy(a);
    std::cout << b << std::endl;

    double c = 2.0;
    auto d = copy(c);
    std::cout << d << std::endl;

    return 0;
}