检查类型相等性

时间:2019-07-28 19:55:26

标签: c++ templates

我有一个struct和template类,其中有一个函数应检查T是否等于struct,如果是,则执行某些操作。

结构:

struct mystruct
{
    int x;
    int y;
    int z;    
};

模板类:

template <typename T>
class myclass
{
    public:
    void myfunc()
    {
        // this condition is ignored..
        if(std::is_same<T,mystruct>::value==0)
        {
             cout << "T is not mystruct type" << '\n';

        }
        else
        {
            T ms;
            ms.x = 5;
            ms.y = 4;
            ms.z = 3;
        }
    }
};

在主函数中,如果T == mystruct一切顺利:

int main()
{
    // no issues
   myclass<mystruct> x;
   x.myfunc();
}

但是如果T!= mystruct:

int main()
{
    //tries to unsuccessfuly convert int to mystruct
   myclass<int> x;
   x.myfunc();
}

执行失败,并出现以下错误:

error: request for member 'x' in 'ms', which is of non-class type 'int'
             ms.x = 5;

有人知道为什么if-else语句不能按预期工作吗? 谢谢!

1 个答案:

答案 0 :(得分:2)

即使<add name="App.DataAccess.Properties.Settings.DatabaseConnectionString" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True" providerName="System.Data.SqlClient" /> 条件的值为if,对于特定的模板实例,整个模板仍必须由有效的C ++代码组成。

例如,如果模板的参数为false,则int语句的else部分等效于:

if

很明显为什么它不能编译。因为整个模板变成了,所以等同于:

    else
    {
        int ms;
        ms.x = 5;
        ms.y = 4;
        ms.z = 3;
    }

即使 if (true) { cout << "T is not mystruct type" << '\n'; } else { int ms; ms.x = 5; ms.y = 4; ms.z = 3; } 从未执行,它也必须是有效的C ++代码。模板没有什么不同。

C ++ 17引入了if constexpr,它要求所求值的else表达式是恒定的,只有if语句的适当部分最终被编译,其余部分有效丢弃。因此,使用C ++ 17,您应该能够将if语句更改为if,并获得预期的结果。