【发布时间】:2009-02-23 16:22:03
【问题描述】:
无法创造性地缩短标题 :)
我一直在使用以下解决方案的变体,但我一直想知道是否有更好/更清洁的方法来实现它。我正在寻找非增强解决方案。不过,我们可以看看 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 ();
}
另一种更简洁的方法是使用 tr1::function,它将变成 新标准化的缺陷:
#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 ();
}
【问题讨论】:
-
对不起 - 我不太明白你的代码的意义。为什么不 boost::bind 和 boost::function 做你想做的事?这看起来非常复杂 - 我一定错过了一些强大的功能,它可以让你做到。
-
我不知道你的实际问题是什么。你能改写你想要达到的目标吗?