Est-il possible d'accéder aux valeurs des paramètres du modèle non de type en classe modèle spécialisé?

StackOverflow https://stackoverflow.com/questions/1162401

Question

Est-il possible d'accéder aux valeurs des paramètres du modèle non de type en classe 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 je voudrais être en mesure d'accéder aux valeurs.

Est-il possible dans un <4,0> pour accéder aux valeurs de 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;
       ...
   }
Était-ce utile?

La solution

Ce genre de problème peut être résolu en ayant un ensemble distinct de struct « 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; 
    }   
};

Autres conseils

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;
    ...
}

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

#include <iostream>

template <int major, int minor, int= major, int= minor> struct A {
    void f() { std::cout << major << '\n'; }
};

template <int major, int minor> struct A<major, minor, 4, 0> {
    void f() { std::cout << major << ':' << minor << '\n'; }
};

int main()
{
    A<3, 3>().f();
    A<4, 0>().f();
}

Non, vous n'avez pas accès aux paramètres spécialisés de modèle non de type. Mais voici une façon de ne pas se répéter dans la mise en œuvre de f:

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

   template <int major, int minor>
   struct A : public f_impl<major, minor>
   {};

   template <> struct A<4,0> : public f_impl<4,0>
   {};

Pour cet exemple, on ne gagne pas tous trop, car il faut écrire le 4,0 deux fois (-SO vous pouvez l'écrire ainsi une seconde fois dans le cout dans votre OP). Mais il commence à payer si vous avez plus de fonctions en utilisant les paramètres du modèle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top