如何使用 C++11 创建有效的闭包

How do I create an efficient closure using C++11?

本文关键字:闭包 有效 创建 何使用 C++11      更新时间:2023-10-16

我正在尝试捕获传递给类似闭包的对象中的函数的参数。主要目标是捕获(存储引用而不是副本)任何类型的参数。(原因如下。

这是一个非常简化的版本,仅捕获 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'