Согласно этому ответу , я использовал
template <typename T,
typename = typename enable_if<bool_verfier<T>()>::type> >
classMember(const T& arg);
В качестве сигнатуры функции для нескольких членов класса, где bool_verifier<T>()
является шаблонной функцией, которая утверждает, что конкретныйкласс T
удовлетворяет определенным требованиям, с типом возврата constexpr bool
.Это гарантирует, что конкретная перегрузка classMember(const T& arg)
используется только для определенных типов аргументов, но это невозможно сделать при наличии нескольких перегрузок с одинаковой сигнатурой прототипа / аргумента, поскольку компилятор не допустит этого:
// ...
template <typename T, typename = typename enable_if<bool_verfier<T>()>::type> >
classMember(const T& arg);
template <typename T, typename = typename enable_if<!(bool_verfier<T>())>::type>>
classMember(const T& arg);
// ...
, что приводит к следующей ошибке компиляции:
‘template<class T, class> void myClass::classMember<T>(const T&)’
cannot be overloaded with
‘template<class T, class> void std::myClass<T>::classMember(const T&)’
Если мне нужно, чтобы classMember
имел разные определения в зависимости от того, вернет ли bool_verifier<T>()
истину, каков будет правильный синтаксис /декларация участника?В качестве альтернативы, есть ли способ вызвать bool_verifier<T>
из условного оператора прекомпилятора #if
?