-2

这个模板化的 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 && ..) ??

调用(获取)???

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

private:
  T* _ptr;
};
4

1 回答 1

1

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

假设以下上下文

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

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

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

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

于 2016-06-29T06:01:14.400 回答