reference_wrapper 实施细节
reference_wrapper implementation details
此模板化 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()?怎么运行的?
return内容是什么"result_of::type"?
什么是 (ArgTypes && ..) ??
调用(获取)???
这段代码看起来像是来自另一个星球的 C++:)
private:
T* _ptr;
};
why do we need operator() anyway? how it works?
假设以下上下文
int foo(int bar)
{
return bar + 5;
}
int main()
{
std::reference_wrapper<int(int)> ref = foo;
ref(5);
}
ref(5)
调用引用包装器的 operator()
。如果它不在那里,它就不会工作,因为在这种情况下不会发生用户定义的转换。
operator()
returns std::result_of<T&(ArgTypes&&...)
,这是存储的函数的 return 值,std::invoke
调用该函数并将参数转发给它。
此模板化 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()?怎么运行的?
return内容是什么"result_of::type"?
什么是 (ArgTypes && ..) ??
调用(获取)???
这段代码看起来像是来自另一个星球的 C++:)
private:
T* _ptr;
};
why do we need operator() anyway? how it works?
假设以下上下文
int foo(int bar)
{
return bar + 5;
}
int main()
{
std::reference_wrapper<int(int)> ref = foo;
ref(5);
}
ref(5)
调用引用包装器的 operator()
。如果它不在那里,它就不会工作,因为在这种情况下不会发生用户定义的转换。
operator()
returns std::result_of<T&(ArgTypes&&...)
,这是存储的函数的 return 值,std::invoke
调用该函数并将参数转发给它。