gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:30:15 24 4
gpt4 key购买 nike

有人可以帮助我以正确的方式构建此源代码,我知道我应该将回调声明为 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;
}

最佳答案

您的代码有几个问题。首先,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();
}

关于c++ - 模板类重载 std::bind 成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29199273/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com