【问题标题】:How do I create an efficient closure using C++11?如何使用 C++11 创建高效的闭包?
【发布时间】:2014-05-20 13:05:39
【问题描述】:

我试图在一个类似闭包的对象中捕获传递给函数的参数。主要目标是捕获(存储引用而不是副本)任何类型的参数。 (这里是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 以使上述编译?

【问题讨论】:

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


    【解决方案1】:

    你必须为std::forward指定一个显式类型

    pair&lt;T1&amp;&amp;, T2&amp;&amp;&gt; p(forward&lt;T1&gt;(t1), forward&lt;T2&gt;(t2));

    如果你想这样使用它,编译器也无法确定endl的类型,所以它们也必须指定endl&lt;char, char_traits&lt;char&gt;&gt;,你可能应该使用'\n'

    【讨论】:

      猜你喜欢
      • 2020-06-26
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      • 2017-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      相关资源
      最近更新 更多