【问题标题】:Pass functors by value or by C++11 Universal Reference? [duplicate]按值或 C++11 通用参考传递函子? [复制]
【发布时间】:2012-12-06 12:04:40
【问题描述】:

可能重复:
Should templated functions take lambda arguments by value or by rvalue reference?

C++ 标准库函数按值接受函子(函数指针或函数对象)参数,如下所示:

template <typename F>
void apply(F func)
{
    func();
}

...但是通过Universal Reference 传递函子不是更好吗?像这样:

template <typename F>
void apply(F&& func)
{
    func();
}

这样您可以传递维护状态的函数对象,并在高阶函数返回后访问该(可能已修改)状态。

【问题讨论】:

  • 模板在编译时展开/解析。他们如何知道编译时的状态?
  • 请注意,对于第一个,您始终可以使用引用包装器来避免复制。
  • @Manoj R:我的意思是:你有一个函数对象变量 fn_obj,你调用 apply(fn_obj),然后你可以访问 fn_obj.state,它可能已经被调用修改了申请

标签: c++ c++11 functor argument-passing higher-order-functions


【解决方案1】:

这已经是一些算法的情况;例如在g++ 4.7.0:

//stl_algo.h

template<typename _RandomAccessIterator, typename _UniformRandomNumberGenerator>
void
shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
    _UniformRandomNumberGenerator&& __g)
{
    ...
}

显然,对于诸如随机数生成器之类的东西来说,这是必不可少的。不过,我想这会随着时间的推移变得更加普遍。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 2011-04-03
    • 2012-10-28
    • 2021-11-04
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多