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

时间:2014-04-08 03:07:27

标签: c++ c++11 rvalue-reference

我试图捕获传递给类似闭包的对象中的函数的参数。主要目标是捕获(存储引用而不是副本)任何类型的参数。 (这里是why。)

这是一个非常简化的版本,只捕获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以进行上述编译?

1 个答案:

答案 0 :(得分:1)

您必须为std::forward

指定显式类型

pair<T1&&, T2&&> p(forward<T1>(t1), forward<T2>(t2));

如果你想像这样使用它,编译器将无法弄清endl的类型,所以它们也必须指定endl<char, char_traits<char>>,你可能应该使用'\n' {{1}} 1}}无论如何。