Ce n'est pas possible. La manière habituelle vous le faites est la suivante:
template<int N>
struct foo {
static const int value = N;
};
et pour les types
template<typename T>
struct foo {
typedef T type;
};
Vous pouvez y accéder alors que foo<39>::value
ou foo<int>::type
.
Si vous avez un type particulier, vous pouvez utiliser la spécialisation de modèle partiel:
template<typename>
struct steal_it;
template<std::size_t N>
struct steal_it< std::bitset<N> > {
static const std::size_t value = N;
};
Le même principe est possible aussi des paramètres de type, en effet. Maintenant, vous pouvez lui passer n'importe quel bitet, comme steal_it< std::bitset<16> >::value
(attention à utiliser size_t, pas int!). Comme nous n'avons pas encore de nombreux paramètres de template, nous devons nous limiter à un nombre de paramètres particulier, et répéter les spécialisations du template steal_it de 1 à N. Une autre difficulté est de scanner les types qui ont des paramètres mixtes (types et non-types). types de paramètres). C'est probablement non trivial à résoudre.
Si vous avez pas le type, mais seulement un objet de celui-ci, vous pouvez utiliser une astuce, pour obtenir encore une valeur au moment de la compilation:
template<typename T>
char (& getN(T const &))[steal_it<T>::value];
int main() {
std::bitset<16> b;
sizeof getN(b); // assuming you don't know the type, you can use the object
}
L'astuce est de rendre le modèle de fonction automatique déduire le type, puis renvoyer une référence à un tableau de caractères. La fonction n'a pas besoin d'être définie, la seule chose nécessaire est son type.
Bon tour. Une chose cependant, vous commencez par dire que ce n'est pas possible, mais ensuite procéder à montrer que c'est! :) –
@Richard Corden: Je pense qu'il disait qu'il n'est pas possible de faire avec RTTI – cdleary
Richart Corden. Je voulais dire qu'il n'est généralement pas possible de choisir des paramètres arbitraires. Considérez ceci: template class, class, size_t> classe foo; cette astuce ne sera pas leur type :) –
2
+0
+0
0
0
Dernière question
-
1. Portée du développement Web
-
2. Windows/opengl glext.h build issue
-
3. 403 Erreur interdite dans Firefox uniquement, fonctionne dans Chrome et Safari
-
4. Bug avec le fichier du designer dmbl sous VS2008?
-
5. MySQL: GROUP_CONCAT avec LEFT JOIN
-
6. Utiliser _trackPageview sur pageload avec jquery?
-
7. Exécution d'un script python de inittab pas en tant que root
-
8. Comment puis-je transmettre tous les éléments de "tableau de hachage" en fonction sous la forme d'un tableau
-
9. Comment est-il possible de voir le code C# après compilation/optimisation?
-
10. Powershell intégration avec Python (pas IronPython)
- Aucun problème connexe^_^
Dans le cas de
std::bitset
, vous pouvez simplement utiliser la fonction membresize()
:Dans le cas général, vous pouvez définir une fonction membre qui retourne la taille d'une manière similaire:
Source
2008-11-19 07:20:27
Je parle de l'extraire des classes tiers avec pas de méthode 'size()' ou quoi que ce soit de similaire - l'extraire juste en connaissant le type lui-même. La raison en est que je ne veux pas avoir à faire une instance fictive juste pour obtenir la taille du bitet typedef'd. – cdleary
Ce n'est pas une pénalité particulièrement mauvaise pour le bitset, mais il pourrait y avoir d'autres types où l'instanciation d'un type factice est indésirable ou impraticable. – cdleary
Vous pouvez facilement le faire en C++ 11 en utilisant la déduction d'arguments et les contextes non évalués (notez que la démo utilise la fonction de modèle de variable de C++ 14 pour plus de commodité).
Live demo
Source
2018-01-11 08:19:59
Comme indiqué par d'autres réponses, pour
std::bitset
vous pouvez obtenir la taille en utilisant la fonction de membresize()
, qui devrait être le bon choix, mieux que tout autre affaire.Il y avait plusieurs propositions pour le cas générique, presque semblable à celui que je suggère ci-dessous, mais je pense que celui-ci est plus simple:
Source
2018-02-04 13:42:26
Questions connexes