我的课程模板在我的
中如下所示 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>>;
我理解这是一个微不足道的问题,对模板和共享指针不熟悉,有很多东西可以解决这个问题
所以基本上问题是你可以像上面那样创建一个通用的共享指针类型并实例化对象吗?
答案 0 :(得分:1)
Counter
是类模板,它带有两个参数,即:此类模板由T1
和Count
参数化。通过为这些参数提供参数,从此类模板生成类类型。
假设您传递给类模板的任何参数彼此不同,即:T1type
与T2type
不同或n
与{{1}不同},然后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>
可以是不同的类型。
答案 1 :(得分:0)
您可以使用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>>();