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 :) –