タイトルを創造的に短くすることができませんでした:)
私は以下のソリューションのバリエーションを使用してきましたが、それを実装するためのより良い/よりクリーンな方法があるかどうか常に疑問に思っていました. ブースト以外のソリューションを探しています。ただし、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 ();
}