gpt4 book ai didi

c++ - 在 class> 中强制模板函数为 T=B*

转载 作者:搜寻专家 更新时间:2023-10-31 02:14:39 25 4
gpt4 key购买 nike

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

它的大部分公共(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*>因为:

  1. T*适合 unique_ptr<T>根据您的要求问题
  2. 它包括所有常用方法。像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++ - 在 class<std::unique_ptr<B>> 中强制模板函数为 T=B*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39716092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com