Question

Le code ci-dessous est ok:

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
}

Mais lorsque j'utilise une classe pour les regrouper, elle ne peut pas être compilée:

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);
}

Impression Clang ++:

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

Alors j'écris quelque chose à tricher au compilateur (ajoutez un S en seconde foo):

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

Cela ne peut toujours pas fonctionner:

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

Comment puis-je le faire fonctionner dans une classe?

Était-ce utile?

La solution 2

Les deux fonctions des membres doivent avoir un paramètre de modèle différent (suivant fonctionnera OK)

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; }

};

Autres conseils

Tu as oublié d'ajouter ::taper après activer_if: (voir activer_if)

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

Si vous voulez vraiment faire ce que vous faites, l'idiome classique est d'introduire un faux argument SFINAE avec une valeur par défaut:

bool foo(T t, std::enable_if<..., void*> = nullptr) { ... }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top