由于我的noob声誉,我无法回复此主题,特别是接受的答案:
我从未使用过boost :: intrusive智能指针,但如果你使用shared_ptr智能指针,你可以使用weak_ptr对象作为缓存.
当系统决定释放内存时,那些weak_ptr指针不算作引用,但只要该对象尚未被删除,它就可用于检索shared_ptr.
这当然是一个直观的想法,但是,C++标准不支持weak_ptrs的比较,因此它不能用作关联容器的键.这可以通过为weak_ptrs实现比较运算符来规避:
template<class Ty1, class Ty2>
bool operator<(
const weak_ptr<Ty1>& _Left,
const weak_ptr<Ty2>& _Right
);
Run Code Online (Sandbox Code Playgroud)
这个解决方案的问题是
(1)比较运算符必须获得每次比较的所有权(即从weak_ptr refs创建shared_ptrs)
(2)当管理资源的最后一个shared_ptr被破坏时,weak_ptr不会从缓存中删除,但是过期的weak_ptr会保留在缓存中.
对于(2),我们可以提供自定义析构函数(DeleteThread),但是,这将需要再次从要删除的T*创建weak_ptr,然后可以使用它从缓存中擦除weak_ptr.
我的问题是,如果有更好的方法使用智能指针缓存(我使用VC100编译器,没有提升),或者我根本没有得到它?
干杯,丹尼尔
建议使用映射类型而不是显式部分类型,请参阅 https://www.typescriptlang.org/docs/handbook/advanced-types.html#mapped-types
即代替
interface PersonPartial {
name?: string;
age?: number;
}
Run Code Online (Sandbox Code Playgroud)
我们会用
interface Person {
name: string;
age: number;
}
type Partial<T> = {
[P in keyof T]?: T[P];
}
type PersonPartial = Partial<Person>;
Run Code Online (Sandbox Code Playgroud)
是否可以映射到另一个方向,例如
type NotPartial<T> = {
[P in keyof T]!: T[P];
}
type Person = NotPartial<PersonPartial>;
Run Code Online (Sandbox Code Playgroud)
因为我有一个生成的部分接口,这会由于鸭子类型而破坏我的类型检查。