Я начал работать с кодом, который часто использует функции шаблонов, но я нахожу эту часть языка совершенно чужой, хотя я довольно хорошо знаком со многими другими функциями 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;
}
Я уверен, что это имеет значение в целом, но в этом случае вывод такой же. В чем разница под поверхностью? Как именно компилятор читает и интерпретирует объявления этого типа?
Я просмотрел ответы на этот вопрос , но я не смог получить от них достаточного понимания, чтобы ответить на мои вопросы.