Metaprogrammation et generation de code
Bonjour � tous.
je poss�de une super classe A dont d�rive les classes B, C et D.
Je souhaite qu'une fonction de la classe Info m'affiche connu si l'objet qu'on lui passe est du type A ou d�riv� de A ou sinon inconnu.
Pour cela j'utilise donc la m�taprogrammation en m'inspirant de cette page de wikipedia .
Voici le code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
#include <iostream>
class A{};
class B : public A{};
class C : public A{};
class D : public A{};
template <class H, class SousListe> struct ListeType {};
struct ListeFin {};
template <class T> class Node;
// Spécialisation pour le type de fin de liste
// C'est la super-classe
template <> class Node< ListeFin >
{
public:
template <class Z> void getPath(const Z& z)
{
std::cout << " inconnu" << std::endl;
}
};
template <class H,class SousListe> class Node< ListeType<H, SousListe> > : public Node<SousListe>
{
public:
template <> void getPath(const H& h){
std::cout << "connu" << std::endl;
}
};
/*
template <class H,class SousListe> template <> void Node< ListeType<H, SousListe> >::getPath(const H& h)
{
std::cout << " connu" << std::endl;
}
*/
typedef ListeType<A, ListeType<B, ListeType<C, ListeType<D, ListeFin> > > > UneListeClasses;
int main()
{
int i;
A a;
Node<UneListeClasses> node;
node.getPath(a);
B b;
node.getPath(b);
C c;
node.getPath(c);
return 0;
} |
Avec ce code, j'obtient l'erreur
Citation:
explicit specialization in non-namespace ‘class Node<ListeType<H, SousListe> >’ scope.
D'apres mes recherches, je n'ai pas le droit de specialiser dans la classe.
Je comment donc la fonction dans la classe et je cr�er ce qui est comment� dans le code.
Mais ca ne compile pas, l'erreur est:
Citation:
essaimetaprog.cpp:35: error: invalid explicit specialization before ‘>’ token
essaimetaprog.cpp:35: error: enclosing class templates are not explicitly specialized
essaimetaprog.cpp:35: error: no member function ‘getPath’ declared in ‘Node<ListeType<H, SousListe> >’
Une id�e ?
Merci.