我想一般地“腌制”函数调用,以便以后执行它们。这些函数的返回类型将始终是void
(目前)。像这样的东西:
template<typename F, typename... Args>
std::function<void()>
pickle(F function, Args&&... args) {
return std::bind(F, args...);
}
问题是,如果args
包含 const 引用,std::bind
则尝试复制构造该值,如果该类型缺少复制构造函数,这并不总是理想的,甚至是无效的。如何以std::ref
用于左值引用和正常std::forward
用于左值引用的方式转发参数?
例子
#include <functional>
class NonCopyable {
public:
NonCopyable() {}
NonCopyable(const NonCopyable&) = delete;
};
template<typename F, typename... Args>
std::function<void()>
pickle(F function, Args&&... args)
{
return std::bind(function, std::forward<Args>(args)...);
}
int main()
{
NonCopyable obj;
auto f = pickle(
[](const NonCopyable&) {},
obj
);
return 0;
}
上面的代码片段不会编译,抱怨删除的复制构造函数。(我在这里使用 forward 是因为有人建议它,但似乎已经删除了他们的答案)。