C ++ std :: enable_if - Функциональность второго аргумента - PullRequest
0 голосов
/ 06 сентября 2018

Я начал работать с кодом, который часто использует функции шаблонов, но я нахожу эту часть языка совершенно чужой, хотя я довольно хорошо знаком со многими другими функциями C ++.

Я писал следующий тестовый код:

#include <iostream>

template <class T,
          typename std::enable_if<std::is_integral<T>::value, T>::type* = nullptr>
void foo(T arg) {
  std::cout << "Integral template" << std::endl;
}

template <class T,
          typename std::enable_if<std::is_class<T>::value, T>::type* = nullptr>
void foo(T arg) {
  std::cout << "Class template" << std::endl;
}

class MyClass{
 public:
  MyClass() {}
};

int main() {
  foo(3);
  foo(MyClass());

  return 0;
}

, который дает вывод

Integral template
Class template

В этот момент меня беспокоил тип T во втором параметре std::enable_if, потому что я не мог видеть, что он служит какой-либо цели. Что, если я просто заменил его на что-нибудь простое, например int?

#include <iostream>

template <class T,
          typename std::enable_if<std::is_integral<T>::value, int>::type = 0>
void foo(T arg) {
  std::cout << "Integral template" << std::endl;
}

template <class T,
          typename std::enable_if<std::is_class<T>::value, int>::type = 0>
void foo(T arg) {
  std::cout << "Class template" << std::endl;
}

class MyClass{
 public:
  MyClass() {}
};

int main() {
  foo(3);
  foo(MyClass());

  return 0;
}

Я уверен, что это имеет значение в целом, но в этом случае вывод такой же. В чем разница под поверхностью? Как именно компилятор читает и интерпретирует объявления этого типа?

Я просмотрел ответы на этот вопрос , но я не смог получить от них достаточного понимания, чтобы ответить на мои вопросы.

1 Ответ

0 голосов
/ 07 сентября 2018

В вашем случае вы можете указать любой тип, для которого вы можете указать значение по умолчанию для шаблона, поэтому int полностью допустимо. Указатели также являются распространенной альтернативой (поэтому T* в вашем случае).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...