reference_wrapper实现细节

时间:2016-06-29 02:28:42

标签: c++ templates stl reference-wrapper

这个模板化的operator()如何在reference_wrapper实现

中工作
template <class T>
class reference_wrapper {
public:
  // types
  typedef T type;

  // construct/copy/destroy
  reference_wrapper(T& ref) noexcept : _ptr(std::addressof(ref)) {}
  reference_wrapper(T&&) = delete;
  reference_wrapper(const reference_wrapper&) noexcept = default;

  // assignment
  reference_wrapper& operator=(const reference_wrapper& x) noexcept = default;

  // access
  operator T& () const noexcept { return *_ptr; }
  T& get() const noexcept { return *_ptr; }

在这里:

  template< class... ArgTypes >
  typename std::result_of<T&(ArgTypes&&...)>::type
    operator() ( ArgTypes&&... args ) const {
    return std::invoke(get(), std::forward<ArgTypes>(args)...);
  }

为什么我们还需要operator()?这个怎么运作?

返回内容“result_of :: type”是什么?

什么是(ArgTypes&amp;&amp; ..)??

调用(获取)???

此代码看起来像来自另一个星球的C ++:)

private:
  T* _ptr;
};

1 个答案:

答案 0 :(得分:1)

  

为什么我们还需要operator()?这个怎么运作?

假设以下上下文

int foo(int bar)
{
    return bar + 5;
}

int main()
{
    std::reference_wrapper<int(int)> ref = foo;
    ref(5);
}

ref(5)调用operator()引用包装器。如果它不存在,它将无法工作,因为在这种情况下不会发生用户定义的转换。

operator()返回std::result_of<T&(ArgTypes&&...),这是存储函数的返回值,std::invoke调用此函数并将参数转发给它。