这是我想使用模板做的事情:

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/

10-10 22:21