Определение различных функций-членов в соответствии с условиями времени компиляции - PullRequest
0 голосов
/ 28 ноября 2018

Согласно этому ответу , я использовал

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?

1 Ответ

0 голосов
/ 28 ноября 2018

В качестве альтернативы, есть ли способ вызвать bool_verifier<T> из условного оператора прекомпилятора #if?

Нет.Препроцессор запускается раньше всего и вообще не знает 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();
};

live godbolt.org ссылка

...