【发布时间】:2018-06-30 05:59:02
【问题描述】:
当将参数传递给std::bind 时,它们总是被复制或移动,除非被 std::ref 包裹并且我想对 lambda 表达式做同样的事情。
问题是,我想将 lambda 表达式的生成包装在一个函数中,并将用户传递的参数转发给 lambda。我想这样做的原因是我想异步调用 lambda 并让用户决定参数是通过引用传递还是通过复制传递。
考虑以下示例。我有以参数为参考的函数print_address。然后我有函数combine_and_call_bind 将参数转发到std::bind。
void print_address(int& a) {
std::cout << "Adress of a = " << &a << std::endl;
}
template<typename F, typename Args>
void combine_and_call_bind(F f, Args&& args) {
auto a = std::bind(f, std::forward<Args>(args));
a();
}
用户可以在调用combine_and_call_bind函数时指定参数是复制到std::bind还是通过将参数包装在std::ref中以引用方式传递:
combine_and_call_bind(print_address, a); // copy a into std::bind
combine_and_call_bind(print_address, std::ref(a)); // pass a as reference into std::bind
如何在使用 C++11 时对以下函数 combine_and_call_lambda 执行相同操作?
template<typename F, typename Args>
void combine_and_call_lambda(F f, Args&& args) {
auto a = [/* std::forward<Args>(args) */, f] {
f(args);
};
a();
}
【问题讨论】:
-
不相关,但
address是正确的拼写。 -
&? (还有 11 个) -
@user202729 已编辑;)如果我将变量捕获为
&,它只会作为引用传递,或者我可以指定通过复制来捕获它吗?