Est-il possible d'accéder à des valeurs de paramètres de modèle non-type dans une classe de modèles spécialisés?Est-il possible d'accéder à des valeurs de paramètres de modèle non-type dans une classe de modèle spécialisé?
Si je classe modèle avec spécialisation:
template <int major, int minor> struct A {
void f() { cout << major << endl; }
}
template <> struct A<4,0> {
void f() { cout << ??? << endl; }
}
Je sais que le cas ci-dessus, il est simple à coder les valeurs 4 et 0 au lieu d'utiliser des variables, mais ce que j'ai une plus grande classe que je suis spécialisé et j'aimerais pouvoir accéder aux valeurs.
Est-il possible dans A < 4,0> d'accéder aux valeurs major
et minor
(4 et 0)? Ou dois-je les affecter à l'instanciation de modèle comme des constantes:
template <> struct A<4,0> {
static const int major = 4;
static const int minor = 0;
...
}
Si vous vous spécialisez sur la base de valeurs, cela implique qu'il y a quelque chose de spécial à propos de ces valeurs particulières. Si vous les utilisez comme valeurs générales dans le modèle et que vous les traitez uniquement comme spéciaux dans certains endroits, il se peut que vous puissiez extraire le comportement spécial dans un modèle de classe spécialisé plus petit, laissant le grand modèle entièrement générique et non spécialisé. C'est un peu difficile à dire, alors pouvez-vous élargir votre question pour être plus «réel»? –
Je pense que la question est assez réelle. J'ai une classe de base existante qui implémente un comportement spécifique basé sur la version du protocole. Auparavant, il y avait un membre qui renvoyait la version du protocole - comme ce membre n'était plus disponible il y avait une méthode de journalisation qui incluait la version du protocole en sortie. Je pourrais juste coder en dur les valeurs mais je voulais savoir s'il y avait un meilleur moyen. La réponse acceptée fournit une bonne façon de le faire - j'utilise en fait des traits de manière similaire dans d'autres endroits - pour obtenir les types de paramètres mais l'intention est la même. – stefanB