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
parfoo
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.
après substitution vous obtiendrez '' –
@PiotrSkotnicki droite. Modification –
Cela devrait probablement le faire, je suppose. – einpoklum