好吧,我已经有这个作为一个工作的例子,但我只是想清理它。使用函数调用内部的绑定
目前我有一个订阅风格的事件系统与回调例程。
我在将常规函数和类成员函数添加到存储变量中没有问题。
但id喜欢通过重载我的Event.subscribe方法来清理它。
目前,它做一些事情,像这样:
template <class T>
class EventObject
{
public:
void subscribe(const T& arg)
{
this->events.push_back(arg);
}
std::vector<T> events;
}
,然后在我的主要的使用,像这样:
void someCallback(const std::string& line)
{
cout <<line;
}
typedef std::function<void(const std::string& line)> onMessageCallbackFunction;
EventObject<onMessageCallbackFunction> messageCallback;
messageCallback.subscribe(someCallback);
现在泡菜挺身而出,当我使用一个类的成员函数。我讨厌在传递它之前必须内在地绑定这个函数。它使代码看起来很脏。
例如:
class B
{
void callbk(const std::string& line) {}
};
B b;
using std::placeholders::_1;
onMessageCallbackFunction memfunc = std::bind(&B::callbk, b, _1);
messageCallback.subscribe(memfunc);
现在推倒它的工作原理,但它看起来糟糕。什么是语法,所以我可以只是瓶胚:
messageCallback.subscribe(&B::callbk, b);
试过几个,但我似乎无法得到它只是正确的。
它是什么并不:
template <class J>
void subscribe(J::T cls,T& t); //Nope.
void subscribe(J&& cls,T& t); //Nope.
超近距:(THX TOBI)
template< class J, class... Args >
void subscribe(void(J::*funct)(Args), J& inst) {
using std::placeholders::_1;
subscribe(std::bind(funct, inst, _1));
}
现在只需要一般的参数列表。
不知道,但我想我宁愿lambdas绑定 – user463035818
你可以看到它是如何实现在std :: thread ctor(3) - http://en.cppreference.com/w/cpp/thread/thread/thread-它不是微不足道的,所以你更好地使用'std :: function' – Slava
@Slava那么你会怎么做呢? –