Согласно этот ответ, я использовал
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?
@VittorioRomeo предположительно потому, что enable if был установлен как значение по умолчанию, которое не является частью подписи, что привело к переопределению
У вас есть C++ 17?
@PiotrSkotnicki: конечно, но OP должен поставить это в вопросе. Нам не нужно гадать
@VittorioRomeo Компилятор не позволит точно, потому что ни один компилятор не будет принимать перегрузки функций с тем же прототипом. Я редактировал вопрос.
@MatthieuBrucher Нет, я делаю это с помощью C++ 11





Alternatively, is there a way to call
bool_verifier<T>from an#ifprecompiler conditional statement?
Неа. Препроцессор запускается раньше всего и совсем не знает C++.
Вероятно, вам потребуется устранить неоднозначность между двумя перегрузками с помощью дополнительного параметра шаблона (или путем изменения места появления enable_if), поскольку значения параметров шаблона по умолчанию не являются частью сигнатуры. Для меня работает следующее:
struct foo
{
template <typename T, typename = std::enable_if_t<bool_verifier<T>{}>>
void a();
template <typename T, typename = std::enable_if_t<!bool_verifier<T>{}>, typename = void>
void a();
};
Хотя это, похоже, работает в отношении перегрузки / разрешения шаблона, если я вызову arg.dim() в первой перегрузке, когда arg имеет тип std::vector<int>, это приведет к ошибке компиляции has no member named dim(), несмотря на то, что в таком случае будет использоваться вторая перегрузка, поскольку bool_verifier будет вернуть false.
Кроме того, это, похоже, отдельная проблема. Отметьте это как решенное и опубликуйте новый вопрос с соответствующей ошибкой компилятора MCVE +.