删除模板类型

nma*_*rko 6 c++ templates class

我有一个看起来像这样的泛型类:

template <class T>
class Example
{
  private:
    T data;
  public:
    Example(): data(T())
    Example(T typeData): data(typeData) 
    ~Example()

    // ...
};
Run Code Online (Sandbox Code Playgroud)

我对如何为这样的事情实现解构器感到困惑.具体来说,既然T是任何类型的,它可以是在堆栈上分配的内存(Example通过无参数构造函数创建的情况总是如此)或堆上.

例如,如果客户端发出的类型Tint*,并提供一个指向动态内存,我怎么知道调用deletedata,而不是在客户端设置的类型int

Rei*_*ica 7

最简单的答案是:不要.不要试图猜测用户并做一些他们可能没想到的事情.采用与标准容器相同的策略:假设T正确清理后.

如果客户端代码编写正确,它将使用RAII类(如智能指针)自动和正确管理内存和其他资源.如果不是,您不能希望在提供商代码中修复它.

让你的类工作,std::unique_ptrstd::shared_ptr,以及任何其他自定义RAII类,并让你的客户做管理自己.毕竟,如果他们想要存储非拥有指针怎么办?