我有一个存储类,它可以添加/删除元素。

它的大多数公共(public)功能都具有与所示功能非常相似的签名:

template<class T> class Storage{
    public: void add(T& t){ ... }
    //... other fields,functions
}

很棒的是T可以是值或原始指针。

现在,我也想升级此存储以支持T=std::unique_ptr
我要完成的是:
Storage<std::unique_ptr<B>> store;
B* b = new B();
store.add(b);   //my attempt - it is currently not supported

这是我支持新功能的草稿:-
template<class T> class Storage{
    public: template<class TWeak> void add(TWeak& tw){  ...   }
    //... other fields,functions
}

从草案中,我认为将TWeak用作模板参数有些危险-TWeak可以是任何东西。

粗略地说,TWeak只能是T's weakpointer与我的意图相矛盾。

更具体地说,我要执行此规则:
When   T=std::unique_ptr<B>   ==>    TWeak have to be B* or std::unique_ptr<B>
When   T=B*                   ==>    TWeak have to be B*
When   T=B                    ==>    TWeak have to be B

如何优雅地执行规则?
具有2个add函数的解决方案仍然可以接受。

最佳答案

为了使界面保持简单,可以使用特殊化扩展Storage,该特殊化提供诸如unique_ptr的封闭类型:

template<class T>
class Storage<std::unique_ptr<T>> : public Storage<T*>{
  public: using Storage<T*>::add;
  public: void add(std::unique_ptr<T>& t){ ... }  //
};

我们继承Storage<T*>是因为:

按照您的要求,
  • T*unique_ptr<T>配合得很好
    问题
  • 它包括所有常用方法。像add()这样的特殊方法
    分别定义,并且using指令用于取消隐藏
    基本方法

  • 用法:
    Storage<int> si; si.add(/*int variable*/);
    Storage<int*> spi; spi.add(/*int* variable*/);
    Storage<std::unique_ptr<int>> su; su.add(/*int* or unique_ptr<int> variable*/);
    

    这是一个demo

    关于c++ - 强制模板函数在类<std::unique_ptr <B >>中为T = B *,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39716092/

    10-11 16:29