2016-04-10 2 views
0

Je veux définir template <typename T> struct is_non_negative dans un sens pour T intégrale et d'une autre manière pour à virgule flottante. Voici ce que je l'ai fait:Comment puis-je "ostensiblement-mais-pas-vraiment" enfreindre la règle de définition unique avec enable_if et SFINAE?

template<typename T> 
struct is_non_negative: public curry_right_hand_side<greater_equal< 
    typename std::enable_if<std::is_integral<T>::value, T>::type>, constant<T, 0>> { }; 

template<typename T> 
struct is_non_negative: public curry_right_hand_side<greater_equal< 
    typename std::enable_if<std::is_floating_point<T>::value, T>::type>, constant_by_ratio<T, std::ratio<0,1>>> { }; 

Cela déclenche une erreur de compilation (GCC 4.9.3, -std=c++11):

error: class template "cuda::is_non_negative" has already been defined 

et, eh bien, il a, mais il n'a pas non plus, puisque le modèle les instanciations sont distinctes.

Comment puis-je obtenir cet effet et obtenir la compilation de mon code?

Notes:

  • Jamais esprit comment je définissais constant, constant_by_ratio et - ils ont été testés et le travail.
  • Si je remplace le second is_non_negative par foo alors cela compile et est utilisable - mais pas avec le même identifiant.
  • La motivation pour les deux définitions ici est l'impossibilité d'utiliser des valeurs à virgule flottante comme paramètres de modèle, mais ne vous concentrez pas sur cet aspect de l'exemple.

Répondre

3

Peut-être que vous pourriez faire quelque chose comme ceci:

template<class T, class = void> 
struct is_non_negative; 

template<typename T> 
struct is_non_negative<T, typename std::enable_if<std::is_integral<T>::value>::type>: public curry_right_hand_side<greater_equal<T>, constant<T, 0>> { }; 

template<typename T> 
struct is_non_negative<T, typename std::enable_if<std::is_floating_point<T>::value>::type>: public curry_right_hand_side<greater_equal<T>, constant_by_ratio<T, std::ratio<0,1>>> { }; 
+0

après substitution vous obtiendrez ''

+0

@PiotrSkotnicki droite. Modification –

+0

Cela devrait probablement le faire, je suppose. – einpoklum