2010-06-09 10 views
5

Je suis sûr que boost a quelques fonctions pour le faire, mais je ne connais pas assez les bibliothèques pertinentes. J'ai une classe de template, qui est assez basique, sauf pour une torsion où j'ai besoin de définir un type conditionnel. Voici le code de pseudo pour ce que je veuxDéfinitions de type conditionnel

struct PlaceHolder {}; 
    template <typename T> 
class C{ 
    typedef (T == PlaceHolder ? void : T) usefulType; 
}; 

Comment écrire ce type conditionnel?

+0

Intéressant. Dans quelles circonstances cela serait-il utile? Pouvez vous donner un exemple. – Stephen

+0

Voici mon exemple. Pour un les arguments de modèle, disons TYPE, ayant la valeur PlaceHolder signifie "désactiver certaines fonctionnalités". Il y a un ensemble de rappels qui ont un type de retour TYPE * que la signification naturelle de la désactivation de la fonction est pour les callbacks d'avoir le type de retour vide. usefulType est la valeur de retour pour les rappels. –

+0

@pythonicmetaphor pourriez-vous s'il vous plaît changer la réponse acceptée? Les temps sont différents maintenant. – Ven

Répondre

8

également avec la nouvelle norme:

typedef typename std::conditional<std::is_same<T, PlaceHolder>::value, void, T>::type usefulType

+1

Ceci devrait être la réponse acceptée. –

2
template < typename T > 
struct my_mfun : boost::mpl::if_ 
< 
    boost::is_same<T,PlaceHolder> 
, void 
, T 
> {}; 

template < typename T > 
struct C { typedef typename my_mfun<T>::type usefulType; }; 
+0

Le code doit être préfixé par 4 espaces. Vous pouvez sélectionner du texte et cliquer sur le bouton 101010 pour le faire en masse. – GManNickG

+0

Merci, mais s'il vous plaît ne pas modifier mes réponses. –

+7

Voir la FAQ: "Si vous n'êtes pas à l'aise avec l'idée que vos questions et réponses soient éditées par d'autres utilisateurs de confiance, ce site n'est peut-être pas pour vous." – Bill

6

Je pense que c'est le principe que vous êtes après:

template< class T > 
struct DefineMyTpe 
{ 
    typedef T usefulType; 
}; 

template<> 
struct DefineMyType<PlaceHolder> 
{ 
    typedef void usefulType; 
}; 

template< class T > 
class C 
{ 
    typedef typename DefineMyType<T>::usefulType usefulType; 
}; 
+1

Cela ne devrait pas être la réponse acceptée en 2015. – Ven

+1

Il ne devrait pas, mais je ne peux pas le changer .. Juste upvote celui en utilisant std :: conditionnel, tout utilisateur SO sera probablement assez intelligent pour considérer la réponse la plus upvoted. – stijn

+1

S'il vous plaît ajouter un "voir la réponse plus tard par @rafak" ou quelque chose, de sorte que les gens savent à regarder en amont. – Ven

Questions connexes