Можно ли специализировать класс сразу для нескольких типов?
К примеру:
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";}
};