在c ++中解绑定std :: bind

时间:2016-09-15 15:18:42

标签: c++ function-pointers

我有许多函数指针与它们各自的类对象绑定:

ExampleClass EO;
std::function<void()> Example=std::bind(&ExampleClass::ExampleFunction, &EO);

但是,我想稍后“取消绑定”这些,特别是确定每个'std :: function所涉及的特定类。

auto Unbind(std::function<void()> &Example)->void
{
  //Find which object &Example is bound with (in this case EO/ExampleClass)
}

这样做的最佳方式是什么?

2 个答案:

答案 0 :(得分:4)

std::function执行类型擦除。根据名称,它会从界面中删除真正的底层类型。

没有办法从那里回来。

如果您想保留目标对象的类型,那么std::mem_fn可能就是您想要的:

http://en.cppreference.com/w/cpp/utility/functional/mem_fn

答案 1 :(得分:1)

您无法使用function对象执行此操作。

一种可能性是构造一个包装器,用于存储对方法和对象的引用。

这样的事情:

template<typename T, typename Fn>
struct MemberFunctionPointer {
  MemberFunctionPointer(T* ref, Fn fn) : m_ref(ref),
                                          m_method(fn) { }

  template<typename... Args>
  auto operator()(Args&&... args) {
    return (m_ref->*m_method)(std::forward<Args...>(args)...);
  }

  T* m_ref = nullptr;  // a reference (pointer) to the object instance
  Fn m_method = nullptr;  // a reference to the function method
};

注意:这只是一个划痕。您应该添加更复杂的界面。此外,为了创建MemberFunctionPointer对象,辅助函数也很有用。

您可以传递这种对象,而不仅仅是function

struct Foo {
  void bar() {
    // something
  }
};

int main(int argc, char *argv[]) {
  Foo f;
  MemberFunctionPointer<Foo, decltype(&Foo::bar)> method(&f, &Foo::bar);

  method();  // call the method on the object f.

  assert(&f == method.get_obj_reference());
  return 0;
}