函数“ if constexpr”和“ else if constexpr”的返回

时间:2019-06-16 03:45:30

标签: c++11 c++17

我是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()的真正代码编译器。

1 个答案:

答案 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;
}