如何将成员函数绑定到 C++14 中的对象
How to bind a member function to an object in C++14
我正在尝试将成员函数绑定到对象,同时保持参数打开。我知道我可以通过将它包装在一个 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<>::value 时它们都是 0。我如何初始化 place_holder<_Num> 将 _Num 的所有必需值构造为 std::placeholders?希望有一个简单的解决方法。任何帮助表示赞赏。谢谢!
占位符的编号从 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)>{});
}
我正在尝试将成员函数绑定到对象,同时保持参数打开。我知道我可以通过将它包装在一个 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<>::value 时它们都是 0。我如何初始化 place_holder<_Num> 将 _Num 的所有必需值构造为 std::placeholders?希望有一个简单的解决方法。任何帮助表示赞赏。谢谢!
占位符的编号从 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)>{});
}