0

タイトルを創造的に短くすることができませんでした:)

私は以下のソリューションのバリエーションを使用してきましたが、それを実装するためのより良い/よりクリーンな方法があるかどうか常に疑問に思っていました. ブースト以外のソリューションを探しています。ただし、boost と C++0x の実装を見ることはできます。

//Notice the use of template template parameter
template <template <typename> class Callback>   
class A {
   Callback <A> m_func;
   public:
     A (Callback <A>  func):  m_func (func) {}
     void call () { m_func(*this);}

};

template <typename T>
struct MYCallback
{
   void operator () (const T&t) {}

};


void Test()
{
   typedef A<MYCallback> AType;

   MYCallback<AType> callback;
   AType a (callback);
   a.call ();

}

もう 1 つのより簡潔な方法は、tr1::function を使用することです。これは、新しい標準化で defuct-to になります。

#include <tr1/functional>


class A {
   std::tr1::function <void (const A&)>  m_func;
   public:
     template <class Callback>
     A (Callback func) :  m_func (func) {}

     void call () { m_func(*this);}

};

template <class T>
struct My_callback
{
   void operator () (const T&t) {}

};

void Test ()
{
   My_callback <A> c;
   A a (c);
   a.call ();
}
4

3 に答える 3

1

これらのものにエレガンスを求めるとき、void* はあなたの味方であると私は常に信じています。

于 2009-02-23T16:59:58.613 に答える
0

クリーンアップのアドバイスだけを探している場合は、'My_callback' をクラス テンプレートではなく、通常のクラスにすることをお勧めします。この場合、テンプレートである必要は明らかではありません。代わりに、適用演算子をテンプレート化するか、 My_callback が A インスタンスのみを処理する場合は A を直接入力します。

#include <tr1/functional>

class A {
   std::tr1::function <void (const A&)>  m_func;
   public:
     template <class Callback>
     A (Callback func) :  m_func (func) {}

     void call () { m_func(*this);}

};

struct My_callback
{
   template <class T>
   void operator () (const T&t) {}
};

int main ()
{
   My_callback c;
   A a (c);
   a.call ();
}

それ以外の場合は、このままで十分です。クリーンアップまたは簡素化する方法について、より具体的に教えていただけますか?

于 2009-02-23T18:52:21.853 に答える
0

これを行う 1 つの方法は、派生クラスを使用することです。

template <class Callback>   
class A {
   Callback m_func;
   public:
     A (Callback  func):  m_func (func){}
     void call () { m_func(*this);}

};

template <typename T>
struct MYCallback
{
   void operator () (const T&t) {}

};


struct AConcrete : public A<MYCallback<AConcrete> >
{
  template <class T>
  AConcrete(T t): A<MYCallback<AConcrete> > (t) {}
};

void Test()
{

   MYCallback<AConcrete> callback;
   AConcrete a (callback);
   a.call ();

}

PS: C++ テンプレートでは再帰は難しいです。

于 2009-02-23T17:01:33.850 に答える