1

これは、テンプレートを使用してやりたいことです。

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 つのメソッドのいずれもオーバーライドできません。ここで明らかに何かが欠けています。私のエラーは何ですか?いいえ、これは宿題ではありません。これは好奇心です。

4

3 に答える 3

3

GCC4.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> ();
}

method()「prettifier」テンプレート関数をから移動する方法がわかりませんtest

于 2010-04-25T22:13:11.923 に答える
1
template< size_t N >
struct ops : ops< N - 1 >

これは無限ループをコーディングします。Nが0に達しても再帰は停止しません。プライマリテンプレートの直後に、エンドケースの特殊化を追加します。

template<>
struct ops<0> {}

また、これは何をしますか?ops<i>::DoStuff()直接電話してみませんか?

template< size_t i >
void Method()
{ if( i < N ) ops<i>::DoStuff(); } 
于 2010-04-25T22:10:10.017 に答える
1

あなたの本来の欲求を模倣するには:

#define MAKE_OPS(N) template<> struct Ops<N> : Ops<N-1> { virtual void Method##N() = 0; }

template<int N>
struct Ops;

template<>
struct Ops<0> { };

MAKE_OPS(1);
MAKE_OPS(2);
template<> struct Ops<3> : Ops<2> { virtual void Method3() { std::cout << "3" << std::endl; } };
MAKE_OPS(4);
MAKE_OPS(5);
MAKE_OPS(6);

struct Test : Ops<3> {
    virtual void Method1() { std::cout << 1 << std::endl; }
    virtual void Method2() { std::cout << 2 << std::endl; }
};
于 2010-04-25T22:15:17.160 に答える