Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 共享\u ptr如何存储删除器?_C++_Function_Generics_Shared Ptr - Fatal编程技术网

C++ 共享\u ptr如何存储删除器?

C++ 共享\u ptr如何存储删除器?,c++,function,generics,shared-ptr,C++,Function,Generics,Shared Ptr,我无法理解共享\u ptr如何存储我给它的删除程序 最初,使用shared\u ptr,我认为它可能使用std::function,但作为删除程序,我可以提供任何类型的函数(或可调用对象),只要第一个参数是int* shared\u ptr如何做到这一点 对不起,如果这是一个愚蠢的问题,我是新到C++的,请原谅我!p> 编辑: 问题是:我怎么能做这样的事情?我应该用什么?有什么例子吗?或者这是一个非常高级的主题?删除程序和分配器都会被删除。共享指针管理一个动态分配的、私有的、模板化的控制对象,该

我无法理解
共享\u ptr
如何存储我给它的删除程序

最初,使用
shared\u ptr
,我认为它可能使用
std::function
,但作为删除程序,我可以提供任何类型的函数(或可调用对象),只要第一个参数是
int*

shared\u ptr
如何做到这一点

对不起,如果这是一个愚蠢的问题,我是新到C++的,请原谅我!p> 编辑:
问题是:我怎么能做这样的事情?我应该用什么?有什么例子吗?或者这是一个非常高级的主题?

删除程序和分配器都会被删除。共享指针管理一个动态分配的、私有的、模板化的控制对象,该对象通过多态库访问,并存储所有特定于类型的状态和功能

std::function
的实现使用了类似的思想,因为它也是一个类型擦除动态管理器类,但两者通常是完全分开实现的

结果是,这两个类都相对“昂贵”,只有在真正需要时才应该使用它们。否则,更便宜的、非多态的非动态解决方案通常更可取

作为删除器,我可以给出任何类型的函数(或可调用对象),只要第一个参数是
int*

不,不是真的。
std::shared\u ptr
构造函数具有以下合同,见第20.8.2.2.1节(
[util.smartptr.shared.const]
):


您想了解您的特定编译器和库吗?(如果是,告诉我们你在用什么)或者C++标准对所有一致的实现都说什么?我知道我怎么做这样的事情。我将编辑该消息。@Toccio:该行为由模板启用。这是一个高级话题。值得称赞的是,这个问题是合理的,而且说得很好。如果您只想知道类型擦除的基础,请先执行
any
。其余的只是添加细节。此应用程序是用于类型擦除的海报子应用程序。请参阅@hvd:I说过“必须是唯一没有默认参数的参数”。在您的示例中,它是“如果您的编译器在提供具有多个必需参数的删除程序时没有捕获到您,那么它做的事情相当错误。”不一定。违反Requires条款会导致UB。编译器不需要对其进行诊断。@T.C.:通常是这样的。在这种情况下,为了避免出现导致编译错误的
d(p)
调用,必须在库中进行一些非常不正常的操作(比如转换函数指针——哎呀!)。
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);
[d, p] { d(p); }