C++ std::与bool不工作是一样的吗 #包括 样板 无效函数(T参数) { int-Val=0; if(std::is_same::value) Val+=Param?1:0; } int main() { std::数组A; Func(A); 返回0; }

C++ std::与bool不工作是一样的吗 #包括 样板 无效函数(T参数) { int-Val=0; if(std::is_same::value) Val+=Param?1:0; } int main() { std::数组A; Func(A); 返回0; },c++,c++11,templates,traits,C++,C++11,Templates,Traits,当我使用gcc或MSVC编译时,我得到: 错误C2440'?':无法从“std::array”转换为“bool” 编译器不应该编译Val+=Param吗?1 : 0;因为std::is_same::value为0?在当前场景中,当编译器尝试实例化Func模板时, 它看到: 其中Param有一个类型为std::array,因此它会抱怨 问题是,if子句with在函数模板实例化期间不会神奇地删除代码的一部分 从C++17开始,您可以使用: 如果constexpr(std::is_same_v) Va

当我使用gcc或MSVC编译时,我得到:

错误C2440'?':无法从“std::array”转换为“bool”


编译器不应该编译
Val+=Param吗?1 : 0;因为
std::is_same::value
为0?

在当前场景中,当编译器尝试实例化
Func
模板时, 它看到:

其中
Param
有一个类型为
std::array
,因此它会抱怨

问题是,if子句with在函数模板实例化期间不会神奇地删除代码的一部分

从C++17开始,您可以使用:

如果constexpr(std::is_same_v)
Val+=Param?1 : 0;
}
其中

在C++17之前,您可以进行一些标记分派的实验。例如,类似这样的方法应该有效:

if constexpr (std::is_same_v<T, bool>)
   Val += Param ? 1 : 0;
}
模板
自动获取(常量T&p,标准::真实类型){
返回p?1:0;
}
样板
自动获取(常量T&p,标准::错误类型){
返回0;
}
然后:

template<typename T>
auto get(const T& p, std::true_type) {
    return p ? 1 : 0;
}

template<typename T>
auto get(const T& p, std::false_type) {
    return 0;
}
模板
无效函数(T参数)
{
int-Val=0;
// ...        
Val+=get(Param,std::is_same{});
}

在当前场景中,当编译器尝试实例化
Func
模板时, 它看到:

其中
Param
有一个类型为
std::array
,因此它会抱怨

问题是,if子句with在函数模板实例化期间不会神奇地删除代码的一部分

从C++17开始,您可以使用:

如果constexpr(std::is_same_v)
Val+=Param?1 : 0;
}
其中

在C++17之前,您可以进行一些标记分派的实验。例如,类似这样的方法应该有效:

if constexpr (std::is_same_v<T, bool>)
   Val += Param ? 1 : 0;
}
模板
自动获取(常量T&p,标准::真实类型){
返回p?1:0;
}
样板
自动获取(常量T&p,标准::错误类型){
返回0;
}
然后:

template<typename T>
auto get(const T& p, std::true_type) {
    return p ? 1 : 0;
}

template<typename T>
auto get(const T& p, std::false_type) {
    return 0;
}
模板
无效函数(T参数)
{
int-Val=0;
// ...        
Val+=get(Param,std::is_same{});
}

分支必须仍然是可编译的,即使它永远不会被执行。如果constexpr
,是否要使用
?回答为。不是100%确定我们是否应该把它关闭though@NathanOliver看起来不像是完全重复,特别是因为接受的答案不是OP在此需要的。分支必须仍然是可编译的,即使它永远不会被执行。是否要使用
if constexpr
?回答为。不是100%确定我们是否应该把它关闭though@NathanOliver看起来不像是一个完全的骗局,特别是因为公认的答案不是OP需要的。
template<typename T>
void Func(T Param)
{
    int Val = 0;        
    // ...        
    Val += get(Param, std::is_same<T, bool>{});
}