仅当泛型类型的值是指针时,才删除该值

Delete value with generic type only if it's a pointer

本文关键字:删除 泛型类型 指针      更新时间:2023-10-16

假设你有一个类,例如:

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是否是指针,如果是,请将其删除,而不会出现编译器错误?

使用专门的帮助程序类,类似于以下行:

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);
}

简单地假设资源自我管理。如果类型 T 的变量不释放资源,则假定这是预期行为。

例如,如果将非拥有指针

传递给类模板,则不希望它删除它,因为该指针是非拥有的。

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

假设你有一个单例Bar,并且有一个返回Bar*的函数Bar::instance

// 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 如果您只是删除析构函数,您已经拥有了最佳解决方案。