【问题标题】: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 如果您简单地删除析构函数,您已经有了最好的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-13
        • 2020-06-24
        • 2011-09-14
        • 2011-05-25
        • 2010-10-22
        相关资源
        最近更新 更多