Reference_wrapper实现细节
reference_wrapper implementation details
这个模板化操作符()在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
调用该函数并向其转发参数
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 'using namespace'实现细节的便捷方法(仅标头库)?
- 将C++项目迁移到 Java,保护实现细节
- 如何在C++共享库中隐藏业务对象的实现细节并提供接口
- 接口,在C++中隐藏具体的实现细节
- 无锁单写多读列表的实现细节
- 为初学者澄清C++中类定义和实现的一些细节
- 在它的核心,如何实现提升元组(在提升标头中没有所有额外的细节)
- 如何查找编译器实现细节
- 循环包含在c++头文件中隐藏实现细节的技巧
- 通过减少填充头的数量来隐藏实现细节
- boost::python是如何工作的?对实现细节有什么想法吗?
- Reference_wrapper实现细节
- 内存池背后的常见实现细节是什么?