возврат функций "if constexpr" и "else if constexpr" - PullRequest
1 голос
/ 16 июня 2019

Я новичок в 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 Ответ

4 голосов
/ 16 июня 2019

что такое настоящий компилятор кода для process () генерируется после того, как мы вызываем код выше в основной функции.

process() не является функцией, и ее скомпилированная версия не создается (по крайней мере, в типичных реализациях); скорее ваша программа производит четыре отдельных функции, а именно process<bool>, process<int>, process<double> и process<std::string>, каждая из которых имеет свою собственную скомпилированную версию.

И это не относится только к if constexpr & mdash; это просто, как шаблоны работают в целом в C ++.

Эти скомпилированные версии могут полностью опускать ветви оператора if, которые не сохраняются для аргумента типа; так, например, process<bool> такой, как если бы он был определен так:

template<>
bool process<bool>(bool arg)
{
    return !arg;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...