【发布时间】:2016-05-26 09:15:44
【问题描述】:
我正在尝试将成员函数绑定到对象,同时保持参数打开。我知道我可以通过将其包装在 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。如何为 _Num 的所有必需值初始化 place_holder<_num> 结构作为 std::placeholders?希望有一个简单的解决方法。任何帮助表示赞赏。谢谢!
【问题讨论】:
-
您能否举例说明模板是如何实例化的。
-
我很确定
is_placeholder需要继承自integral_constant<int, N>,而不是integral_constant<std::size_t, N>。 -
我想你想将
obj的地址传递给std::bind而不是obj。喜欢return std::bind(func, &obj, _binding_helper_::get_placholders(std::make_index_sequence<sizeof...(_Args)>{})); -
你需要
std::make_tuple(place_holder<_Indices + 1>()...);,占位符从1开始,而不是0 -
另外,你的代码中非法标识符的数量是可怕的
标签: c++ c++14 member-function-pointers stdbind