10
votes

Est-il possible d'accéder aux valeurs des paramètres de modèle de type de type dans la classe de modèle spécialisée?

est-il possible d'accéder à des valeurs de paramètres de modèle sans type dans une classe de modèle spécialisée?

Si j'ai une classe de modèle avec spécialisation: xxx

Je le sais au-dessus cas, il est simple à des valeurs de codes hard 4 et 0 au lieu d'utiliser des variables, mais ce que j'ai une plus grande classe que je suis spécialisé et que je voudrais pouvoir accéder aux valeurs.

est-il possible dans A <4,0> pour accéder à majeur et de valeurs mineures (4 et 0)? Ou est-ce que je dois l'affecter sur une instanciation de modèle en tant que constantes: xxx


2 commentaires

Si vous êtes spécialisé en fonction des valeurs, cela implique qu'il y a quelque chose de spécial sur ces valeurs particulières. Si vous les utilisez comme des valeurs générales dans tout le modèle et que vous ne les traitez que de manière spéciale dans quelques endroits, il se peut que vous puissiez abstraire le comportement spécial dans un modèle de classe spécialisé plus petit laissant le grand gabarit étant entièrement générique et non spécifié. C'est un peu difficile à dire pour que vous puissiez é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 renvoie la version du protocole - car ce membre n'était plus disponible, une méthode de journalisation était incluse de la version de protocole dans la sortie. Je pouvais juste faire du mal aux valeurs mais je voulais savoir s'il y a une meilleure façon. La réponse acceptée offre une bonne façon de le faire - j'utilise réellement des traits de la même manière dans d'autres endroits - pour obtenir les types de paramètres, mais l'intention est la même.


4 Réponses :


1
votes

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

enum{
 specialisationMajor=4,
 specialisationMinor=0
};

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


1 commentaires

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



17
votes

Ce type de problème peut être résolu en ayant un ensemble distinct de structs "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 commentaires

0
votes

Pas vraiment une réponse à votre question, mais l'idée ci-dessous m'a aidé une fois: xxx


0 commentaires

0
votes

Non, vous n'avez pas accès aux paramètres de modèle spécialisés de type non-type. Mais voici un moyen de ne pas répéter vous-même dans la mise en œuvre de f : xxx

pour cet exemple, on ne gagne pas trop, comme il faut Ecrivez le 4,0 deux fois (-SO Vous pouvez l'écrire aussi une seconde fois dans le Cout dans votre op). Mais il commence à payer si vous avez plus de fonctions à l'aide des paramètres de modèle.


0 commentaires