Это то, что я хотел бы сделать с помощью шаблонов:
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*/};
}
Я хотел бы иметь класс, который просто наследуется от шаблонного класса, который обеспечивает эти объявления методов и в то же время делает их виртуальными. Вот что мне удалось придумать:
#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;
}
Однако, как вы, наверное, догадались, я не могу переопределить ни один из 6 методов, которые я унаследовал. Я явно что-то здесь упускаю. В чем моя ошибка? Нет, это не домашняя работа. Это любопытство.