声明模板的共享指针

declaring a shared pointer of a template

本文关键字:共享 指针 声明      更新时间:2023-10-16

我的类模板如下所示

Counter.hpp

template <typename T1, size_t Count>
class Counter {
public:
explicit Counter();
~Counter() = default;
void inc(T1 t, uint64_t val);
void dec(T1 t, uint64_t val);
private:
uint16_t array[Count];
};

Main.cpp文件中

我能够创建这样的对象:

Counter< MetricCounter1Type, countOfMetricCounter1Type()> myCounter;

并使用对象....但我希望能够像指针声明这样的东西并在堆上创建一个对象:

using counterp = std::shared_ptr <Counter>;
counterp myCounter1p = std::make_shared<Counter<T1type, n>>;
counterp myCounter2p = std::make_shared<Counter<T2type, m>>;

我理解它的琐碎问题,不熟悉模板和共享指针,有太多的事情需要你思考

所以基本上问题是你能像上面一样创建一个通用的共享指针类型并实例化对象吗?

Counter是一个类模板,它采用两个参数,即:这个类模板由T1Count参数化。通过向这些参数提供参数,从此类模板生成类类型。

假设您传递给类模板的任何参数彼此不同,即:T1type不同于T2typen不同于m,那么Counter<T1type, n>Counter<T2type, m>是不同的类型。因此,生成的对象由:

std::make_shared<Counter<T1type, n>>();
std::make_shared<Counter<T2type, m>>();

也有不同的类型。因此,不能定义通用(非模板化)类型来存储这两个对象中的任何一个。


请注意,counterp类型别名不会编译:

using counterp = std::shared_ptr<Counter>;

因为Counter没有收到成为类型所需的两个模板参数。

但是,您可以定义别名模板

template<typename T1, size_t Count>
using counterp = std::shared_ptr<Counter<T1, Count>>;

然后为couterp提供它所需的两个模板参数:

counterp<T1type, n> myCounter1p = std::make_shared<Counter<T1type, n>>();
counterp<T2type, m> myCounter2p = std::make_shared<Counter<T2type, m>>();

再次请注意,counterp<T1type, n>counterp<T2type, m>可以是不同的类型。

您可以使用auto

auto myCounter1p = std::make_shared<Counter<T1type, n>>;
auto myCounter2p = std::make_shared<Counter<T2type, m>>;

或别名模板

template<typename T1, size_t Count>
using counterp = std::shared_ptr <Counter<T1, Count>>;
...
counterp<T1type, n> myCounter1p = std::make_shared<Counter<T1type, n>>();
counterp<T2type, m> myCounter2p = std::make_shared<Counter<T2type, m>>();