2008-11-19 10 views
22

Bien que je doute, je suis curieux de savoir s'il est possible d'extraire des paramètres de type primitif d'un type existant, en utilisant peut-être RTTI.Extraire les paramètres du modèle C++

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 ailleurs? Les implémentations spécifiques au compilateur sont les bienvenues, bien que je sois particulièrement intéressé par g++.

Répondre

37

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.

+0

Bon tour. Une chose cependant, vous commencez par dire que ce n'est pas possible, mais ensuite procéder à montrer que c'est! :) –

+0

@Richard Corden: Je pense qu'il disait qu'il n'est pas possible de faire avec RTTI – cdleary

+3

Richart Corden. Je voulais dire qu'il n'est généralement pas possible de choisir des paramètres arbitraires. Considérez ceci: template