仅当泛型类型的值是指针时,才删除该值
Delete value with generic type only if it's a pointer
假设你有一个类,例如:
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 如果您只是删除析构函数,您已经拥有了最佳解决方案。
相关文章:
- 使用泛型类型推送到堆栈时出现问题
- 如何在容器中指定模板化别名的泛型类型
- 具有模板专用化的泛型类型转换
- C++存储泛型 T 类型类的向量
- 如何在C++中返回没有模板的泛型类型?
- 如何在带有约束 (C++) 的函数中使用泛型类型
- 模板函数重载(泛型类型与模板模板类型)选择正确的重载
- 泛型类型别名,它们彼此不兼容
- 泛型类型转换
- 重载泛型类型的模板类时检查运算符=时的自赋值
- 在C++中,如何根据类中的参数返回不同的泛型类型
- C++错误 C2227:'->looseHealth'左侧必须指向类/结构/联合/泛型类型
- 使用泛型类型显式实例化函数模板
- 函数模板中的无效转换错误,返回值取决于其泛型类型
- 如何确保 "<<" 运算符适用于模板化 ADT 定义中的任何泛型类型?
- 仅当泛型类型的值是指针时,才删除该值
- 错误c++visual studio c2227左侧'->;Init';必须指向类/结构/联合/泛型类型
- 用于泛型类型上的泛型操作的SFINAE
- 为什么可以强制转换的泛型类型不会被隐式转换
- 如何删除指向泛型类型对象的指针数组