Как использовать enable_if в классе obj?

Код ниже в порядке:

template <class T>
std::enable_if<std::is_atomic<T>::value, bool>
foo(T t) { return true; }

template <class T>
std::enable_if<tmp::is_sequence<T>::value, bool>
foo(T t) { return false; }

int main(void){
foo(1);  // return true
auto std::vector<int> a{2};
foo(a);  // return false
}

Но когда я использую класс для связывания их, он не может быть скомпилирован:

template <class T>
class test {
public:

std::enable_if<std::is_atomic<T>::value, bool>
foo(T t) { return true; }

std::enable_if<tmp::is_sequence<T>::value, bool>
foo(T t) { return false; }
};

int main(...) {
test<int> obj;
obj.foo(1);
test<std::vector<int>> obj2;
std::vector<int> tmp{2};
obj2.foo(tmp);
}

clang ++ print:

error: functions that differ only in their return type cannot be overloaded

Поэтому я пишу что-то, чтобы обмануть компилятор (добавить S в секунду foo):

template <class S>
std::enable_if<tmp::is_sequence<T>::value, bool>
foo(T t) { return false; }

Это все еще не может работать:

error: no type named 'type' in 'std::enable_if<false, bool>'

Как я могу заставить его работать в классе?

0

Решение

Обе функции-члены должны иметь разные параметры шаблона (следующие будут работать нормально)

template <class T>
class test {
public:

template<typename U>
typename std::enable_if<std::is_atomic<U>::value, bool>::type
foo(U t) { return true; }

template<typename U>
typename std::enable_if<tmp::is_sequence<U>::value, bool>::type
foo(U t) { return false; }

};
0

Другие решения

Вы забыли добавить ::тип после enable_if: (увидеть enable_if)

template <class T> std::enable_if<std::is_atomic<T>::value, bool>::type
foo(T t) { return true; }
1

Если вы действительно хотите делать то, что делаете, классическая идиома — ввести поддельный аргумент SFINAE со значением по умолчанию:

bool foo(T t, std::enable_if<..., void*> = nullptr) { ... }
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector