我试图捕获传递给类似闭包的对象中的函数的参数。主要目标是捕获(存储引用而不是副本)任何类型的参数。 (这里是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以进行上述编译?
答案 0 :(得分:1)
您必须为std::forward
pair<T1&&, T2&&> p(forward<T1>(t1), forward<T2>(t2));
如果你想像这样使用它,编译器将无法弄清endl
的类型,所以它们也必须指定endl<char, char_traits<char>>
,你可能应该使用'\n'
{{1}} 1}}无论如何。