Les modèles C++: Sélectionnez le type différent en fonction de la valeur de paramètre de modèle
Comment puis-je accomplir le suivant en C++, et qu'est-ce que faire de telles choses appelé?
template <bool S>
class NuclearPowerplantControllerFactoryProviderFactory {
//if S == true
typedef int data_t;
//if S == false
typedef unsigned int data_t;
};
Il y a deux de nombreuses
Non, vous avez besoin de votre contrôleur de l'usine de fabrication fournisseur de usines dans toutes les langues.
Factory
mots dans le nom de cette classe, je pense que vous êtes en train de penser en Java.Non, vous avez besoin de votre contrôleur de l'usine de fabrication fournisseur de usines dans toutes les langues.
OriginalL'auteur porgarmingduod | 2011-11-23
Vous devez vous connecter pour publier un commentaire.
Par spécialisation:
Vous pouvez choisir de faire l'un des deux cas, le principal modèle, et l'autre, la spécialisation, mais je préfère cette plus version symétrique, étant donné que
bool
ne peut avoir que deux valeurs.Si c'est la première fois que vous voyez cela, vous pourriez penser à partielle spécialisation:
@Nawaz dit, le plus simple est probablement de
#include <type_traits>
et de dire:template <typename U> struct remove_pointer<T*> { typedef U type; };
?Oups, merci!
Chaque fois que j'apprends la nouvelle syntaxe C++, la lisibilité de l'avenir tous les code que j'ai écris souffrir...
Au contraire! Regarde ma dernière ligne dans la mise à jour du post: Une ligne, et c'est totalement auto-descriptif. Si vous utilisez les bons outils et les blocs de construction, votre code sera effectivement devenu plus lisible et moins verbeux. Vous remplacez opaque syntaxe non-sens avec l'auto-descriptif, one-liners.
Vous avez raison, je plaisantais. Je suis déjà en utilisant std::conditionnel afin de simplifier grandement les poils d'une classe; le rendre plus générique et utile avec moins de code.
OriginalL'auteur Kerrek SB
@Kerrek a répondu à la question suffisamment, mais qui peut être plus générique comme suit:
Et l'utiliser comme:
Si
S
est vrai, le premier argument de type dansselect
sera sélectionné, ou d'autre deuxième type d'argument sera sélectionné. Il est générique, parce que vous spécifiez à la fois les types deselect<>
, et basé sur la valeur du booléen,select<b,T,U>::type
renvoie premier type ou du second type.std::conditional
🙂std::conditionnel était exactement ce dont j'avais besoin. Si votre réponse est plus général, donc je vais prendre pour la postérité.
La règle d'or est que vous devez être courant d'utilisation de spécialisation de modèle pour faire de la compilation des décisions en temps, et vous regardez le
<type_trait>
bibliothèque et de voir tous les merveilleux outils que sont déjà faits pour vous 🙂OriginalL'auteur Nawaz