Можно ли специализировать класс сразу для нескольких типов?

К примеру:

template<typename T> struct MyStruct{
    //...
    void foo() { cout << "T\n";}
    //...
};

template<> struct MyStruct<float>{
    //... 
    void foo() { cout << "real numbers\n";}
    //...    
};
        
template<> struct MyStruct<double>{
    //...        
    void foo() { cout << "real numbers\n";}
    //...    
};

Специализации <float> и <double> ведут себя одинаково. Можно ли избавится от копипаста и сделать одну специализацию для них двух?


Ответы (1 шт):

Автор решения: Ariox

Вам нужен SFINAE. Например, можно сделать так:

template<class T, class = void> 
struct MyStruct{
    void foo() { cout << "T\n";}
};

template<class T> 
struct MyStruct<T, std::enable_if_t<std::is_floating_point<T>::value>>{
    void foo() { cout << "real numbers\n";}
};

// Еще пример
template<class T> 
struct MyStruct<T, std::void_t<decltype(T::foo())>>{
    void foo() { T::foo(); }
};

Ну или можно использовать концепты из C++20, что-то вроде:

template<std::floating_point T>
struct MyStruct{
    void foo() { cout << "real numbers\n";}
};
→ Ссылка