我们如何在模板类中使用静态映射,模板类的每个实例化都应该使用相同的映射

How do we use static map in template class, with every instantiation of template class the same map should be used

本文关键字:映射 实例化 静态 我们      更新时间:2023-10-16

我正在使用以下代码片段。 当我实例化 TemplateClass 两次(一次使用 int,下一次使用 double(时,我碰巧在 getKey 中看到相同的大小。而 map 是静态的,第二次大小应该是 2。

template<typename T>
class TemplateClass
{
private:
static std::map<int, T> *mKey;
public:
TemplateClass()
{
}
void insert(T value, int count)
{
(*TemplateClass<T>::mKey)[count]=value;
}
long getKey(){return mKey->size();}
};
template<typename T>
std::map<int,T> *TemplateClass<T>::mKey = new std::map<int,T>;
int main()
{
TemplateClass<int> obj1;
obj1.insert(10, 1);
std::cout<<"Object 1 key is: "<<obj1.getKey()<<std::endl;
TemplateClass<double> obj2;
obj2.insert(222.1122, 2);
std::cout<<"Object 1 key is: "<<obj2.getKey()<<std::endl;
return 0;
}

啊,很多事情,尝试使用静态映射的父类。 全球静态地图。

TemplateClass<int>::mKeyTemplateClass<double>::mKey是两个不同的对象。从某种意义上说,它们都是static的,因为它们不与任一类型的任何实例相关联,但是类模板的两个实例化TemplateClass<int>TemplateClass<double>TemplateClass是不同的类类型,因此它们的所有成员也是不同的。

对于任何不同的TU类型,类类型TemplateClass<T>TemplateClass<U>是完全独立的类类型,由于是从同一类模板实例化的,它们恰好共享相似的结构。

您可以(在大多数情况下(很好地定义两个非模板化类TemplateClassIntTemplateClassDouble,所有提及T的类在第一个中被int替换,在第二个中被double替换。