Reference_wrapper实现细节

reference_wrapper implementation details

本文关键字:细节 实现 wrapper Reference      更新时间:2023-10-16

这个模板化操作符()在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 &&. .) ? ?

调用(得到)? ?

这段代码看起来像来自另一个星球的c++:)

private:
  T* _ptr;
};

为什么我们需要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调用该函数并向其转发参数