假设你有一个类,如:
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
是否为指针,如果是,则删除它,没有编译器错误?
答案 0 :(得分:0)
使用专门的助手类,类似于以下几行:
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);
}
答案 1 :(得分:0)
简单地假设资源管理自己。如果您的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如果您只是删除析构函数,那么您已经拥有了最佳解决方案。