C++11 - enable_if - реализация функции вне определения класса
Как я могу реализовать функцию с шаблоном, который имеет enable_if?
class Test
{
public:
Test(){}
~Test(){}
template<typename T, typename std::enable_if<std::is_integral<T>::value>::type>
void do_something(T v);
template<typename T, typename std::enable_if<std::is_floating_point<T>::value>::type>
void do_something(T v);
};
Как реализовать do_something
для разных типов вне определения класса (т.е. во встроенном файле)?
1 ответ
Решение
Ты используешь enable_if
на тип возврата. Это описано на cppreference:
Распространенной ошибкой является объявление двух шаблонов функций, которые отличаются только аргументами шаблона по умолчанию. Это недопустимо, поскольку аргументы шаблона по умолчанию не являются частью сигнатуры шаблона функции, а объявление двух разных шаблонов функций с одной и той же сигнатурой недопустимо.
#include <iostream>
#include <type_traits>
class Test
{
public:
Test(){}
~Test(){}
template<typename T>
typename std::enable_if<std::is_integral<T>::value, void>::type
do_something(T v);
template<typename T>
typename std::enable_if<std::is_floating_point<T>::value, void>::type
do_something(T v);
};
template<typename T>
typename std::enable_if<std::is_integral<T>::value, void>::type
Test::do_something(T v) { std::cout << "Integral\n"; }
template<typename T>
typename std::enable_if<std::is_floating_point<T>::value, void>::type
Test::do_something(T v) { std::cout << "Floating point\n"; }
int main()
{
Test t;
t.do_something(1);
t.do_something(3.14);
}