Вы хотите std::enable_if
, и вам нужно какое-то свойство времени компиляции ваших специальных классов, которого нет у других классов.
template <class T, class S = std::enable_if_t<!is_my_special_v<T>>>
my_nifty_class(T) {some generic code}
template <class T, class S = std::enable_if_t<is_my_special_v<T>>, bool = true>
my_nifty_class(T) {some special code}
(Для создания двух шаблонов необходим фиктивный параметр шаблонаотлично)
Другой метод - иметь только один конструктор и использовать специальный селектор внутри.
template <class T>
my_nifty_class(T) {
if constexpr(is_my_special_v<T>)
some special code
else
some generic code
}
Как вы пишете is_my_special_v? Это просто шаблон со значением false, со специализациями для ваших специальных типов со значением true.
template<class> constexpr bool is_my_special_v = false;
template<> constexpr bool is_my_special_v<MySpecialType1> = true:
// ...
Если все ваши специальные классы имеют какое-то имя члена, которое вряд ли встречается в неспециальныхклассы, вы можете использовать это для того, чтобы записать только одну специализацию итого is_my_special_v вместо одной для каждого специального класса. Ищите «обнаружение членов c ++», много материала там.
Наконец, если это единственное место, где ваши специальные типы действительно особенные, вы можете вообще пропустить is_my_special_v и просто проверить прямо.
template <class T>
my_nifty_class(T) {
if constexpr(std::is_same_v<T, MySpecialType1> ||
std::is_same_v<T, MySpecialType2> ...)
some special code
else
some generic code
}