C++ 模板类重载std::绑定成员函数

C++ 模板类重载std::绑定成员函数,c++,c++11,stdbind,C++,C++11,Stdbind,有人可以帮助我以正确的方式构建源代码, 我知道我应该将回调声明为std::function,因为这不需要复制 可构造参数(std::unique_ptr),那么如果我不使用auto来推断类型,那么正确的类型是什么 #include <functional> #include <memory> template <class T> class SomeClass { void someFunctionCallback(float o) = 0; }; t

有人可以帮助我以正确的方式构建源代码, 我知道我应该将回调声明为
std::function
,因为这不需要复制 可构造参数(
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;
}
#包括
#包括
模板
上课{
void someFunctionCallback(float o)=0;
};
模板
上课{
公众:
SomeClass()=默认值;
内联函数(){
//std::函数
自动回拨{
std::move(std::bind(&SomeClass::someFunctionCallback),
这
std::unique_ptr{new int(9)}});
useCallBack(std::move(callBack));
}
内联void someFunctionCallback(std::unique_ptr&¶m){
}
内联void useCallBack(std::function&&callBack){
//回调();
}
};
int main(){
k类;
k、 someFunction();
返回0;
}

您的代码有几个问题。首先,
auto{…}
将推导出一个
std::initializer\u列表
。那不是你想要的。改用大括号或相等的初始值设定项

auto callBack =
 std::bind(&SomeClass<float>::someFunctionCallback,
                     this,
                     std::unique_ptr<int>{new int(9)});
最后,把你的函数做成一个模板。整个想法不必担心类型,而且
auto
始终遵循模板参数推导的规则

template <typename T>
inline void useCallBack(T callBack) {
  callBack();
}
模板
内联void useCallBack(T回调){
回调();
}
非常感谢:)我还有其他问题,如果我知道建议使用类型(例如回调),请使用std::initializer\u list({})如果我不担心类型并使用auto,那么我应该使用您之前说的其他方式?
template <typename T>
inline void useCallBack(T callBack) {
  callBack();
}