模板类重载 std::bind 成员函数

Posted

技术标签:

【中文标题】模板类重载 std::bind 成员函数【英文标题】:Template class overload std::bind a member fucntion 【发布时间】:2015-03-22 20:09:06 【问题描述】:

有人可以帮助我以正确的方式构建此源代码, 我了解我将 callBack 声明为std::function<void(std::unique_ptr<int>&& param)>,因为这不需要复制 可构造参数(std::unique_ptr),那么如果我不使用 auto 来推断类型,那么正确的类型是什么?

#include <functional>
#include <memory>

template <class T>
class SomeClass 
  void someFunctionCallback(float o) = 0;
;

template <>
class SomeClass<float> 
 public:
  SomeClass() = default;
  inline void someFunction() 
      // std::function<void()>
    auto callBack 
     std::move(std::bind(&SomeClass<float>::someFunctionCallback,
                         this,
                         std::unique_ptr<int>new int(9)));
     useCallBack(std::move(callBack));
  
  inline void someFunctionCallback(std::unique_ptr<int>&& param) 
  
  inline void useCallBack(std::function<void()> &&callBack) 
//    callBack();
  
;
int main() 
  SomeClass<float> k;
  k.someFunction();
  return 0;

【问题讨论】:

【参考方案1】:

您的代码有几个问题。首先,auto ... 将推导出一个std::initializer_list。那不是你想要的。请改用 brace-or-equal 初始化器。

auto callBack =
 std::bind(&SomeClass<float>::someFunctionCallback,
                     this,
                     std::unique_ptr<int>new int(9));

其次,您的函数采用右值引用,但std::bind 将传递一个左值。阅读Passing rvalues through std::bind 以获得完整的解释,但作为一种解决方法,您可以使用这个丑陋的演员表:

using uptr = std::unique_ptr<int>;

auto callBack =
 std::bind(&SomeClass<float>::someFunctionCallback,
                     this,
                     std::bind(static_cast<uptr&&(&)(uptr&)>(std::move<uptr&>), 
                               std::unique_ptr<int>new int(9))
          ) ;

最后,只需将您的函数设为模板即可。整个想法是不用担心类型,auto 无论如何都遵循模板参数推导的规则。

template <typename T>
inline void useCallBack(T callBack) 
  callBack();

【讨论】:

非常感谢 :) 如果我知道类型(例如 callBack),我还有其他问题,如果我不担心类型并使用 auto,建议使用 std::initializer_list() 然后我应该用你之前说我的其他方式吗?

以上是关于模板类重载 std::bind 成员函数的主要内容,如果未能解决你的问题,请参考以下文章

std::function与std::bind

std::function与std::bind

数据的间距问题(重载+函数模板)

数据的间距问题(重载+函数模板)

使用模板重载类的成员函数

std::function 和 std::bind