仅当泛型类型为指针时才删除它

时间:2017-02-10 03:01:42

标签: c++ templates pointers generics delete-operator

假设你有一个类,如:

template<typename T>
class Foo
{
public:
    T value;
public:
    Foo(const T& value)
    {
        this->value = value;
    }
public:
    ~Foo()
    {
        if(std::is_pointer<T>::value) delete value;
    }
}

现在,显然如果T不是指针,编译器将抛出错误。例如:

Foo<int> foo(42);

有没有办法成功检查T是否为指针,如果是,则删除它,没有编译器错误?

2 个答案:

答案 0 :(得分:0)

使用专门的助手类,类似于以下几行:

template<typename T> class delete_me {

public:

   static void destroy(T &value)
   {
   }
};

template<typename P>
class delete_me<P *> {

public:

   static void destroy(P *value)
   {
       delete value;
   }
};

你的析构函数:

~Foo()
{
    delete_me<T>::destroy(value);
}

答案 1 :(得分:0)

简单地假设资源管理自己。如果您的T类型的变量没有免费资源,那么假定它是预期的行为。

例如,如果你有一个非拥有指针,你传递给你的类模板,你不希望它删除它,因为指针不是拥有。

另一方面,std::unique_ptr会自动释放它包含的指针。

我们假设你有一个单身Bar,并且有一个函数Bar::instance可以返回Bar*

// You don't want Foo to delete instance
Foo<Bar*> foo{Bar::instance()};

但是使用独特的指针,它将如下所示:

Foo<std::unique_ptr<Baz>> foo{std::make_unique<Baz>()};

指向Baz的指针会自动释放,就像你想要的那样。

TL; DR如果您只是删除析构函数,那么您已经拥有了最佳解决方案。