Extrait de C++ les paramètres de modèle
Bien que je doute, je suis curieux de savoir si il est possible d'extraire des primitives de type paramètres du modèle à partir d'un type existant, peut-être à l'aide de RTTI.
Par exemple:
typedef std::bitset<16> WordSet;
Serait-il possible d'extraire le numéro 16 dans le code ci-dessus sans coder en dur elle d'ailleurs? Compilateur implémentations spécifiques sont les bienvenus, même si je suis particulièrement intéressé par la g++
.
Vous devez vous connecter pour publier un commentaire.
Il n'est pas possible. La manière habituelle, vous faire, c'est ceci:
et pour les types
Vous pouvez y accéder alors que
foo<39>::value
oufoo<int>::type
.Si vous avez un type particulier, vous pouvez utiliser partielle du modèle de spécialisation:
Le même principe est possible pour les paramètres de type trop, en effet. Maintenant, vous pouvez passer n'importe quel bitset, comme
steal_it< std::bitset<16> >::value
(remarque pour utiliser size_t, pas int!). Parce que nous n'avons pas variadic de nombreux modèle paramétrée cependant, nous devons nous limiter nous-mêmes à un certain nombre de paramètre, et répétez l'steal_it spécialisations de modèle pour compter de 1 jusqu'à N. une Autre difficulté consiste à numériser les types qui ont mélangé les paramètres (types et non des types de paramètres). Ce n'est probablement pas évident à résoudre.Si vous n'avez pas le type, mais seulement un objet, vous pouvez utiliser une astuce, pour toujours obtenir une valeur au moment de la compilation:
L'astuce est de rendre le modèle de fonction auto-déduire le type, puis renvoyer une référence à un tableau de caractères. La fonction n'a pas besoin d'être défini, la seule chose nécessaire est son type.
Vous pouvez facilement le faire en C++11 utilisation de l'argument de la déduction et non évaluées contextes (à noter que la démo utilise C++14 variables du modèle de fonction pour des raisons de commodité).
démo
Dans le cas de
std::bitset
, vous pouvez simplement utiliser lesize()
fonction de membre:Dans le cas général, vous pouvez définir une fonction membre qui retourne la taille d'une manière analogue:
size()
méthode ou quelque chose de semblable -- l'extraire, il suffit de savoir le type lui-même. La raison étant que je ne veux pas avoir à faire une instance fictive juste pour obtenir la taille de la typedef avais bitset.Comme indiqué par d'autres réponses, pour
std::bitset
vous pouvez obtenir la taille à l'aide de lasize()
fonction de membre, ce qui devrait être le bon choix, mieux que tout autre tour.Il y a eu plusieurs propositions pour le cas générique, presque semblable à celle que j'ai suggérons ci-dessous, mais je pense que c'est plus simple: