如何在类obj中使用enable_if?

时间:2013-11-07 05:38:16

标签: c++ class c++11 overloading enable-if

以下代码没问题:

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

所以我写了一些东西来欺骗编译器(在第二个foo中添加一个S):

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>'

如何让它在课堂上运作?

3 个答案:

答案 0 :(得分:1)

您忘记在 enable_if 之后添加 :: type :(请参阅enable_if

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

答案 1 :(得分: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; }

};

答案 2 :(得分:0)

如果你真的想做你正在做的事情,那么经典的习惯就是引入一个带有默认值的假SFINAE参数:

bool foo(T t, std::enable_if<..., void*> = nullptr) { ... }