以下回调类是通用的“可调用物”的包装器。我非常喜欢它的API,它没有模板而且非常干净,但在底层有一些我无法避免的动态分配。
是否有任何方法可以在保持回调类的语义和API的同时消除下面代码中的new和delete?我真的希望我能做到。
所需内容:
回调类:
非常感谢!!:-)
是否有任何方法可以在保持回调类的语义和API的同时消除下面代码中的new和delete?我真的希望我能做到。
所需内容:
// base class for something we can "call"
class callable {
public:
virtual void operator()() = 0;
virtual ~callable() {}
};
// wraps pointer-to-members
template<class C>
class callable_from_object : public callable {
public:
callable_from_object(C& object, void (C::*method)())
: o(object), m(method) {}
void operator()() {
(&o ->* m) ();
}
private:
C& o;
void (C::*m)();
};
// wraps pointer-to-functions or pointer-to-static-members
class callable_from_function : public callable {
public:
callable_from_function(void (*function)())
: f(function) {}
void operator()() {
f();
};
private:
void (*f)();
};
回调类:
回调类:
// generic wrapper for any callable
// this is the only class which is exposed to the user
class callback : public callable {
public:
template<class C>
callback(C& object, void (C::*method)())
: c(*new callable_from_object<C>(object, method)) {}
explicit callback(void (*function)())
: c(*new callable_from_function(function)) {}
void operator()() {
c();
}
~callback() {
std::cout << "dtor\n"; // check for mem leak
delete &c;
}
private:
callable& c;
};
一个API示例:
struct X {
void y() { std::cout << "y\n"; }
static void z() { std::cout << "z\n"; }
} x;
void w() { std::cout << "w\n"; }
int main(int, char*[]) {
callback c1(x, &X::y);
callback c2(X::z);
callback c3(w);
c1();
c2();
c3();
return 0;
}
非常感谢!!:-)
boost::function
。建议直接使用它,如果你想了解如何使用它,可以查看它的代码。这是由顶尖的C++程序员编写的代码 :) - Johannes Schaub - litb