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

成功

我试图找到传递给模板的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’

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

迈克尔·维克斯勒

与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,则他们会得到ret类型的语法错误std::vector<int>if constexpr语法不容易受到这种错误的,因为它不尝试在编译代码if constexpr是假的(它只做它需要找到最后一个基本的解析}

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

void copy_helper(int var) {
    std::cout << "int\n";
}
template <class T>
void copy_helper(const T&) {}

template<typename ret> 
ret copy(ret var)
{
   copy_helper(var);

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章