【问题标题】:Short way to std::bind member function to object instance, without binding parameters将 std::bind 成员函数绑定到对象实例的快捷方式,无需绑定参数
【发布时间】:2013-01-26 00:31:19
【问题描述】:

我有一个带有多个参数的成员函数。我想将它绑定到特定的对象实例并将其传递给另一个函数。我可以用占位符做到这一点:

// actualInstance is a MyClass*
auto callback = bind(&MyClass::myFunction, actualInstance, _1, _2, _3);

但这有点笨拙 - 一方面,当参数数量发生变化时,我也必须更改所有绑定调用。但此外,键入所有占位符非常乏味,而我真正想要的只是方便地创建一个包含对象引用的“函数指针”。

所以我想做的是:

auto callback = objectBind(&MyClass::myFunction, actualInstance);

有谁知道这样做的好方法吗?

【问题讨论】:

  • 有人建议允许bind(&MyClass::myFunction, actualInstance, std::placeholders::all) 之类的东西这样做
  • 好的 - 你知道为什么它没有包含在标准中吗?
  • 因为是上个月才提出的,所以还没人实施,更别提为标准提出了

标签: c++ stdbind


【解决方案1】:

我认为这会奏效:

template<typename R, typename C, typename... Args>
std::function<R(Args...)> objectBind(R (C::* func)(Args...), C& instance) {
    return [=](Args... args){ return (instance.*func)(args...); };
}

然后:

auto callback = objectBind(&MyClass::myFunction, actualInstance);

注意:您需要重载来处理 CV 限定的成员函数。即:

template<typename R, typename C, typename... Args>
std::function<R(Args...)> objectBind(R (C::* func)(Args...) const, C const& instance) {
    return [=](Args... args){ return (instance.*func)(args...); };
}

【讨论】:

  • 这假定myFunction 不是 cv-qualified,所以如果是则需要调整
  • 您获取地址并使用(&amp;instance)-&gt;*func 而不是instance.*func 的任何特殊原因?
  • @JonathanWakely 除了添加一堆重载之外,还有更好的方法吗?
  • @David 这是编辑留下的。我把它改成.*
  • @David 它不会改变任何东西。 std::function 处理这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2015-07-14
  • 2019-12-24
  • 2012-08-22
相关资源
最近更新 更多