2017-02-10 67 views
1

泛型类型删除值假设你有一个类,如:只有当它是一个指针

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

使用专门的辅助类的东西大致如下:

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); 
} 
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如果你只是简单地移除你的析构函数,你已经有了最好的解决方案。

相关问题