有人可以帮助我以正确的方式构建此源代码,
据我所知,我将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;
}
答案 0 :(得分:2)
您的代码有几个问题。首先,auto { ... }
会推导出std::initializer_list
。那不是你想要的。改为使用大括号或等于的初始化程序。
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();
}