这是我想使用模板做的事情:
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种方法中的任何一种。我显然在这里错过了一些东西。我怎么了不,这不是家庭作业。这是好奇心。
最佳答案
经过GCC 4.3测试。甚至都不知道为什么我花时间在这个上:-/
#include <iostream>
template <std::size_t N>
struct mark
{ };
template <std::size_t N>
struct op : op <N - 1>
{
virtual void do_method (const mark <N>&) = 0;
};
template <>
struct op <1>
{
virtual void do_method (const mark <1>&) = 0;
};
struct test : op <2>
{
template <std::size_t K>
void
method ()
{ do_method (mark <K> ()); }
virtual void do_method (const mark <1>&)
{ std::cout << "1\n"; }
virtual void do_method (const mark <2>&)
{ std::cout << "2\n"; }
};
int
main ()
{
test x;
x.method <1> ();
x.method <2> ();
}
我不知道如何将“prettifier”
method()
模板函数从test
中移出。关于c++ - C++,通用编程和虚函数。我如何得到想要的东西?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2710098/