如何使用 C++11 创建有效的闭包
How do I create an efficient closure using C++11?
我正在尝试捕获传递给类似闭包的对象中的函数的参数。主要目标是捕获(存储引用而不是副本)任何类型的参数。(原因如下。
这是一个非常简化的版本,仅捕获 2 个参数并将它们成对存储:
template<typename T1, typename T2>
void foo(T1&& t1, T2&& t2)
{
pair<T1&&, T2&&> p(forward(t1), forward(t2)); // Capture parameters -- doesn't work
cout << p.first << "," << p.second << endl;
}
int main()
{
string s = "hey";
foo("hello", "world");
foo(1, 2);
foo(s, endl);
return 0;
}
不幸的是,这不能用 g++ 4.7.2 编译:
main.cpp: In instantiation of 'void foo(T1&&, T2&&) [with T1 = basic_string<char>&; T2 = basic_string<char>&]':
main.cpp: error: no matching function for call to 'forward(basic_string<char>&)'
...
如何声明和初始化 p 以使上述编译?
您必须为std::forward
指定显式类型
pair<T1&&, T2&&> p(forward<T1>(t1), forward<T2>(t2));
如果你想这样使用它,编译器也无法弄清楚endl
的类型,所以它们必须endl<char, char_traits<char>>
指定,无论如何你都应该使用'n'
。
相关文章:
- 如何将C++闭包与变量参数同时重用——类似于JavaScript
- C++中的 JavaScript 样式闭包
- 如何使用类模拟 C++11 中的 lambda 函数和闭包?
- 使用带有闭包的 lambda 的回调
- C++中的 Lambda <-> 闭包等价性
- 为什么 std::remove_if 会创建如此多的闭包?
- Lambda闭包左值可以作为右值参考参数传递
- 如何声明接受字符串、返回void的闭包的类型
- 添加了闭包的 Perl newXS()
- 具有意外结果的 C++ 闭包
- 关于函数模板中定义的 lambda 闭包类型可以说些什么?
- 基类如何调用派生类在 c++ 中传递的闭包?
- 通过引用将自定义结构的向量传递给 boost::compute 闭包或函数
- 创建特征以检测C++中的闭包类型
- 在 c++ 中使用函数装饰器(使用闭包)时出现意外的分段错误
- Lambda 表达式闭包函数不起作用
- Lambda 闭包类型构造函数
- 在闭包中,如何通过存储在内存中的指针或引用类型捕获可变性或用现代函数式语言进行处理?
- boost::compute,将指针传递给闭包
- 如何使用 C++11 创建有效的闭包