如何在C ++ 14中将成员函数绑定到对象

时间:2016-05-26 09:15:44

标签: c++ c++14 member-function-pointers stdbind

我正在尝试将成员函数绑定到对象,同时保持参数打开。我知道我可以通过将其包装在lambda表达式(如this)中来实现,但我想使用std :: bind和std :: placeholders来实现它。

到目前为止,这就是我所拥有的:

template <size_t _Num>
struct place_holder {};

namespace std {
  template <size_t _Num>
  struct is_placeholder<::place_holder<_Num>> : integral_constant<size_t, _Num> {};
}

namespace _binding_helper_ {
  template <size_t ... _Indices>
  std::tuple<place_holder<_Indices>...> get_placeholders(std::index_sequence<_Indices...>) {
      return std::make_tuple(place_holder<_Indices>()...);
  }
}

template <typename _Obj, typename _Func, typename ... _Args>
std::function<_Func(_Args...)> bind_function_to_object
    (_Func (_Obj::*func)(_Args...), _Obj & obj) {
    return std::bind(func, obj,
        _binding_helper_::get_placeholders(std::make_index_sequence<sizeof...(_Args)>{}));
}

创建place_holders的元组工作正常,但是当我在元组的元素上调用std :: is_placeholder&lt;&gt; :: value时,它们都是0.如何初始化place_holder&lt; _Num&gt;结构为_Num的所有必需值作为std :: placeholders?希望有一个简单的解决方案。任何帮助赞赏。谢谢!

1 个答案:

答案 0 :(得分:2)

占位符的编号为1,而不是0。由于我提到的原因,我认为static_assert中的条件std::is_placeholder<place_holder<0>>{}失败了。

此外,您将一个占位符元组传递给std::bind。相反,您应该直接传递占位符,即place_holder<Is + 1>{}...

template <int Num>
struct place_holder {};

namespace std 
{
    template <int Num>
    struct is_placeholder<::place_holder<Num>> : integral_constant<int, Num> {};
}

template <typename Obj, typename C, typename Func, typename... Args, int... Is>
std::function<Func(Args...)> bind_function_to_object(Func(C::*func)(Args...), Obj&& obj, std::integer_sequence<int, Is...>)
{
    return std::bind(func, std::forward<Obj>(obj), place_holder<Is + 1>{}...);
}

template <typename Obj, typename C, typename Func, typename... Args>
std::function<Func(Args...)> bind_function_to_object(Func(C::*func)(Args...), Obj&& obj)
{
    return bind_function_to_object(func, std::forward<Obj>(obj), std::make_integer_sequence<int, sizeof...(Args)>{});
}

DEMO