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

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

假设您有一个 class 例如:

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

使用专门的助手class,大致如下:

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 类型的变量不释放资源,则假设这是预期的行为。

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

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

假设您有一个单例 Bar,并且有一个函数 Bar::instance returns a 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 如果你简单地删除你的析构函数,你已经有了最好的解决方案。