Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中的条件语句+;编译器根据条件可以且必须包含的模板 是否可以在C++模板中使用条件语句,如果条件是真的,它只能被“编译”,否则“编译”不被保证(但是编译器检测到它不需要代码,所以无论如何它也不包含)_C++ - Fatal编程技术网

C+中的条件语句+;编译器根据条件可以且必须包含的模板 是否可以在C++模板中使用条件语句,如果条件是真的,它只能被“编译”,否则“编译”不被保证(但是编译器检测到它不需要代码,所以无论如何它也不包含)

C+中的条件语句+;编译器根据条件可以且必须包含的模板 是否可以在C++模板中使用条件语句,如果条件是真的,它只能被“编译”,否则“编译”不被保证(但是编译器检测到它不需要代码,所以无论如何它也不包含),c++,C++,例如,下面的代码没有编译,因为模板实例化A没有名为k的成员。但是,对于模板实例化A,这部分代码实际上是死代码 (此问题的实际使用案例:我希望支持多个顶点类型来加载网格。根据顶点类型,网格文件中将跳过或不跳过某些信息,索引唯一顶点也将不同。) #包括 结构A{ 静态constexpr bool值=false; }; 模板 内联布尔函数(常数T&T){ if(T::value){ return t.k;//错误:“const struct A”没有名为“k”的成员 } 否则{ 返回true; } }

例如,下面的代码没有编译,因为模板实例化
A
没有名为
k
的成员。但是,对于模板实例化
A
,这部分代码实际上是死代码

(此问题的实际使用案例:我希望支持多个顶点类型来加载网格。根据顶点类型,网格文件中将跳过或不跳过某些信息,索引唯一顶点也将不同。)

#包括
结构A{
静态constexpr bool值=false;
};
模板
内联布尔函数(常数T&T){
if(T::value){
return t.k;//错误:“const struct A”没有名为“k”的成员
}
否则{
返回true;
}
}
int main(){
A A;
这里有两个选项

您可以像这样使用模板专门化:

template < typename T >
inline bool f(const T &t) {
    if (T::value) {
        return t.k;
    }
    else {
        return true;  
    }
}

template <>
inline bool f<A>(const A &t) {
    return true;
}

两个选项:
std::enable_if
(C++11)或
if constexpr
(C++17)@Jonas谢谢,
if constexpr
看起来(必须检查我的编译器)像一个非常干净的解决方案。是的,
if constexpr
是一个不错的选择(如果您的编译器支持的话)在您的示例中,这是添加它的原因之一。对于该示例,第一个解决方案确实是正确的,但是对于我的用例来说,由于它涉及到整个主体,代码重复太多。我怀疑是这样的,如果添加了constexpr
,这是众多原因之一。
template < typename T >
inline bool f(const T &t) {
    if (T::value) {
        return t.k;
    }
    else {
        return true;  
    }
}

template <>
inline bool f<A>(const A &t) {
    return true;
}
template < typename T >
inline bool f(const T &t) {
    if constexpr (T::value) {
        return t.k;
    }
    else {
        return true;  
    }
}