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);
}
Другие вопросы по тегам