Toc*_*cio 8 c++ generics function shared-ptr
我无法理解如何shared_ptr存储我给它的删除器.
最初,使用a shared_ptr<int>,我认为它可能会使用a std::function<void(int*)>,但我可以作为删除器给出任何类型的函数(或可调用对象),只要第一个参数是a int*.
怎么shared_ptr办呢?
我很抱歉,如果这是一个愚蠢的问题,我是C++的新手,请原谅我!
编辑:问题是:我怎么能做那样的事情?我该怎么用?任何例子?或者这是一个非常高级的话题?
删除器以及分配器都是类型擦除的.共享指针管理动态分配的私有模板化控制对象,该对象通过多态基础访问,并存储所有特定于类型的状态和功能.
实现std::function使用类似的想法,因为它也是类型擦除动态管理器类,但两者通常完全分开实现.
结果是两个类都相对"昂贵",只应在它们真正必要时使用.否则,通常优选更便宜的非多态非动态解决方案.
只要第一个参数是a,我就可以提供任何类型的函数(或可调用对象)作为删除器
int*。
不,不是。该std::shared_ptr构造具有以下的合同,在第20.8.2.2.1(中[util.smartptr.shared.const]):
Run Code Online (Sandbox Code Playgroud)template<class Y, class D> shared_ptr(Y* p, D d); template<class Y, class D, class A> shared_ptr(Y* p, D d, A a); template <class D> shared_ptr(nullptr_t p, D d); template <class D, class A> shared_ptr(nullptr_t p, D d, A a);要求:
p应可转换为T*。D应该是CopyConstructible的。的复制构造函数和析构函数D不得抛出异常。 该表达式d(p)应格式正确,行为应明确,并且不得抛出异常。A应该是分配器(17.6.3.5)。A的复制构造函数和析构函数不得抛出异常。效果:构造一个
shared_ptr拥有该对象p和Deleter 的对象d。第二个和第四个构造函数应使用的副本a为内部使用分配内存。后置条件:
use_count() == 1 && get() == p。抛出:
bad_alloc,或者当无法获取除内存以外的资源时的实现定义的异常。异常安全性:如果引发异常,
d(p)则被调用。
此要求比删除程序的第一个参数必须为正确的类型强得多。它必须是唯一的参数(没有默认参数),这样才d(p)合法。这比灵活得多std::function<void (int*)>,因为返回类型可以是任何类型,但在异常保证方面也受到更多限制。
如果在为删除程序提供多个必需参数时编译器没有抓住您,则标准库实现做错了什么。
至于如何实现它,请利用它必须是CopyConstructible的事实。例如,以下lambda应该可以很好地工作,并且可以分配给它std::function<void(void)>(CopyConstructible保证可确保按值捕获有效):
[d, p] { d(p); }
Run Code Online (Sandbox Code Playgroud)