仅当它是指针时才删除泛型类型的值
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 如果你简单地删除你的析构函数,你已经有了最好的解决方案。
假设您有一个 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 如果你简单地删除你的析构函数,你已经有了最好的解决方案。