Voilà ce que je voudrais faire en utilisant des modèles:C++, programmation générique et fonctions virtuelles. Comment puis-je obtenir ce que je veux?
struct op1
{
virtual void Method1() = 0;
}
...
struct opN
{
virtual void MethodN() = 0;
}
struct test : op1, op2, op3, op4
{
virtual void Method1(){/*do work1*/};
virtual void Method2(){/*do work2*/};
virtual void Method3(){/*do work3*/};
virtual void Method4(){/*do work4*/};
}
Je voudrais avoir une classe qui dérive tout simplement d'une classe de modèle qui fournit ces déclarations de méthode tout en même temps en les rendant virtuel. Voilà ce que j'ai réussi à trouver:
#include <iostream>
template< size_t N >
struct ops : ops< N - 1 >
{
protected:
virtual void DoStuff(){ std::cout<<N<<std::endl; };
public:
template< size_t i >
void Method()
{ if(i < N) ops<i>::DoStuff(); }
//leaving out compile time asserts for brevity
};
template<>
struct ops<0>
{
};
struct test : ops<6>
{
};
int main(int argc, char ** argv)
{
test obj;
obj.Method<3>(); //prints 3
return 0;
}
Cependant, comme vous l'avez probablement deviné, je suis incapable de passer outre l'une des 6 méthodes que j'ai hérité. Il me manque évidemment quelque chose ici. Quelle est mon erreur? Non, ce n'est pas un devoir. C'est de la curiosité.
Est-ce que même compilez? Je pense que le compilateur se lancerait dans une boucle infinie en essayant d'instancier 'ops '... –
tzaman
Il ne le serait pas s'il y avait une spécialisation pour' ops <1> 'ou' ops <0> 'qui le termine. –
Je pense que le problème est que vous n'avez pas hérité de 6 méthodes - vous avez défini une méthode dans la classe de base et ensuite réimplémenté la même méthode 5 fois dans les descendants. –