簡體   English   中英

如何在C ++ 14中將成員函數綁定到對象

[英]How to bind a member function to an object in C++14

我試圖將一個成員函數綁定到一個對象,同時保持參數打開。 我知道我可以通過將其包裝在lambda表達式( 如此 )中來實現,但我想使用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: :占位符? 希望有一個簡單的解決方案。 任何幫助贊賞。 謝謝!

占位符從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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM