C++ 参考包装器实现细节

C++ 参考包装器实现细节,c++,templates,stl,reference-wrapper,C++,Templates,Stl,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&&) =

这个模板化运算符()在引用包装器实现中是如何工作的

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; }
为什么我们需要操作符()呢?它是如何工作的

假设下面的上下文

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

int main()
{
    std::reference_wrapper<int(int)> ref = foo;
    ref(5);
}
intfoo(intbar)
{
返回条+5;
}
int main()
{
std::reference_wrapper ref=foo;
参考文献(5);
}
ref(5)
调用引用包装的
operator()
。如果它不存在,它就不会工作,因为在这种情况下用户定义的转换不会发生


operator()
返回
std::result\u of oh-wow,这样不仅引用\u包装器可以封装函数,还可以使用一些模板魔术来表达带有模板参数的函数调用?太棒了!你怎么知道的?关于的std::result\u、std::invoke等,我可以从哪里了解到?也就是说,我的意思是,我怎么可能猜测它可以包装一个函数,甚至可以用这个用户定义的模板表示返回类型。有大的系统手册吗?还是它的“神圣知识”?@barney。这个网站不仅有标准类的解释,通常还有可能的实现部分,在那里你可以看到它是如何实现的,你可以从中学到很多东西。@barney“太棒了!你是怎么知道的?”-请看:“如果存储的引用是可调用的,那么std::reference\u包装器可以用相同的参数调用。”以及:调用存储引用的可调用对象。仅当存储的引用指向可调用对象时,此函数才可用。“
private:
  T* _ptr;
};
int foo(int bar)
{
    return bar + 5;
}

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