我是C ++的初学者。 可以解释一下编译过程函数后的输出。 非常感谢。
template <typename T>
auto process(T arg)
{
// 4. With constexpr if, to enable the compiler to generate different code based on the type the template is instantiated with:
if constexpr (std::is_same<T, bool>::value)
return !arg;
else if constexpr (std::is_integral<T>::value)
return -arg;
else if constexpr (std::is_floating_point<T>::value)
return std::abs(arg);
else
return arg;
}
int main(){
...
{
auto v1 = process(false); // true
auto v2 = process(42); // -42
auto v3 = process(-42.0); // 42.0
auto v4 = process("42"s); // "42"
}
...
return 0;
}
在主函数中调用以上代码后,生成了process()的真正代码编译器。
答案 0 :(得分:4)
在主函数中调用以上代码后,生成了process()的真正代码编译器。
process()
不是函数,并且不生成任何编译版本(至少在典型的实现中);相反,您的程序会产生四个独立的函数,分别为process<bool>
,process<int>
,process<double>
和process<std::string>
,每个函数都有其自己的编译版本。
这不是if constexpr
特有的-而是模板在C ++中的一般工作方式。
那些编译版本可以完全忽略if
语句的分支,这些分支对于type参数不成立;因此,例如process<bool>
就像这样定义:
template<>
bool process<bool>(bool arg)
{
return !arg;
}