我有一个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语句不能按预期工作吗? 谢谢!
答案 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
,并获得预期的结果。