template<typename T>
struct foo
{
T data;
};
template<typename T>
struct foo
{
T data;
void func()
requires is_shared_ptr_v<T>
{
// ...
}
};
您可以首先创建一个traits来检测类型是否为std::shared_ptr
(方法取决于是否考虑继承)。
然后利用这些特征建立一个概念:
template <typename T> struct is_shared_ptr : std::false_type {};
template <typename T> struct is_shared_ptr<std::shared_ptr<T>> : std::true_type {};
template <typename T> concept IsSharedPtr = is_shared_ptr<T>::value;
或
template <typename T>
std::true_type inherit_from_shared_ptr_impl(const std::shared_ptr<T>*);
std::false_type inherit_from_shared_ptr_impl(...);
template <typename T>
using inherit_from_shared_ptr =
decltype(inherit_from_shared_ptr_impl(std::declval<T*>()));
template <typename T> concept InheritFromSharedPtr = inherit_from_shared_ptr<T>::value;
指针 (pointer)是一个包含内存地址的变量的通用概念。这个地址引用,或 “指向”(points at)一些其他数据。Rust 中最常见的指针是第四章介绍的 引用(reference)。引用以 符号为标志并借用了他们所指向的值。除了引用数据它们没有任何其他特殊功能。它们也没有任何额外开销,所以应用的最多。 另一方面,智能指针(smart pointers)是一类数据结构,他们的表现类似指针,但
原始指针的缺陷有: 声明中未指出指向的是单个对象还是一个数组 没有提示使用完对象后是否需要析构,从声明中无法看出指针是否拥有对象 不知道析构该使用 delete 还是其他方式(比如传入一个专门用于析构的函数) 即使知道了使用 delete,也不知道 delete 的是单个对象还是数组(使用 delete[]) 难以保证所有路径上只产生一次析构 没有检查空悬指针的办法 智能指针解决了这些问题,它封装
大部分情况下所有权是非常明确的:可以准确的知道哪个变量拥有某个值。然而,有些情况单个值可能会有多个所有者。例如,在图数据结构中,多个边可能指向相同的结点,而这个结点从概念上讲为所有指向它的边所拥有。结点直到没有任何边指向它之前都不应该被清理。 为了启用多所有权,Rust 有一个叫做 Rc<T> 的类型。其名称为 引用计数(reference counting)的缩写。引用计数意味着记录一个值引用的
我最近一直在用C++11智能指针替换所有的原始指针,现在我终于完成了,除了DirectX长指针。
本章讲解 Rc, Arc, Mutex, RwLock, Cell, RefCell 的知识和使用方法。
2.1. 概述 1998年修订的第一版C++标准只提供了一种智能指针: std::auto_ptr 。 它基本上就像是个普通的指针: 通过地址来访问一个动态分配的对象。 std::auto_ptr 之所以被看作是智能指针,是因为它会在析构的时候调用 delete 操作符来自动释放所包含的对象。 当然这要求在初始化的时候,传给它一个由 new 操作符返回的对象的地址。 既然 std::auto_p