我有一个存储类,它可以添加/删除元素。
它的大多数公共(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/