【问题标题】:Delete value with generic type only if it's a pointer [duplicate]仅当它是指针时才删除具有泛型类型的值[重复]
【发布时间】:2017-02-10 03:01:42
【问题描述】:
假设你有一个类,例如:
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是否为指针,如果是则删除,不会出现编译错误?
【问题讨论】:
标签:
c++
templates
pointers
generics
delete-operator
【解决方案1】:
使用专门的帮助类,类似于以下几行:
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);
}
【解决方案2】:
简单地假设资源管理自己。如果您的 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 如果您简单地删除析构函数,您已经有了最好的解决方案。