【发布时间】:2015-01-29 07:15:04
【问题描述】:
我想将回调存储在 C++11 中的向量或其他容器中。
这样做的一种方法是存储 std::function 的向量。 这适用于带有可复制参数的 lambda 或 std::bind。
但是,如果有一个不可复制(仅可移动)的参数,它将由于从 lambda/std::bind 内部类型到 std::function 的转换而失败...
#include <vector>
class NonCopyable {
public:
NonCopyable() = default;
NonCopyable(const NonCopyable &) = delete;
NonCopyable(NonCopyable &&) = default;
};
int main() {
std::vector<std::function<void()>> callbacks;
callbacks.emplace_back([] {});
NonCopyable tmp;
callbacks.emplace_back(std::bind([](const NonCopyable &) {}, std::move(tmp)));
// When converting the object returned by std::bind to a std::function,
// a copy of the arguments happen so this code cannot compile.
return 0;
}
有没有办法将 std::bind 参数移动到 std::function 中而不是复制它们?
【问题讨论】:
-
std::function要求它包装的函子是 CopyConstructible,所以你运气不好。 -
那么有没有更好的模式来存储回调?喜欢 packaged_task 还是其他类?
-
存储指向函数或仿函数的指针,也许?
-
您可以使用
std::reference_wrapper<NonCopyable>,然后您可以将其放入std::vector<std::function<...>>容器中。 -
我对此进行了调查(使用 c++14 lambda 捕获,自定义 Functor 对象),看起来问题出在
std::function,而不是容器或绑定处。std::function不能保存不可复制的对象。 stackoverflow.com/questions/7944635/… 所以你不能使用std::function。