2009-07-22 5 views
10

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; 
     ... 
    } 
+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»? –

+0

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

Répondre

16

Ce genre de problème peut être résolu en ayant un ensemble distinct de structures "Traits".

// A default Traits class has no information 
template<class T> struct Traits 
{ 
}; 

// A convenient way to get the Traits of the type of a given value without 
// having to explicitly write out the type 
template<typename T> Traits<T> GetTraits(const T&) 
{ 
    return Traits<T>(); 
} 

template <int major, int minor> struct A 
{ 
    void f() 
    { 
     cout << major << endl; 
    } 
}; 

// Specialisation of the traits for any A<int, int> 
template<int N1, int N2> struct Traits<A<N1, N2> > 
{ 
    enum { major = N1, minor = N2 }; 
}; 

template <> struct A<4,0> 
{  
    void f() 
    { 
     cout << GetTraits(*this).major << endl; 
    } 
}; 
+0

+1 gentil, merci – stefanB

1

Pas vraiment une réponse à votre question, mais vous pouvez les énumérer, à savoir:

enum{ 
specialisationMajor=4, 
specialisationMinor=0 
}; 

template <> struct A<specialisationMajor,specialisationMinor> { 
    static const int major = specialisationMajor; 
    static const int minor = specialisationMinor; 
    ... 
} 
+0

J'essaie d'éviter de définir un autre ensemble de variables ... qui était la beauté d'avoir ces paramètres de modèle, je ne veux généralement pas accéder aux valeurs ... mais peu importe, mais merci – stefanB

Questions connexes