C++ c+中模板类的容器+;
我有一个模板,可以用于不同的stl映射(C++ c+中模板类的容器+;,c++,templates,metaprogramming,C++,Templates,Metaprogramming,我有一个模板,可以用于不同的stl映射(map,map,等等),如下所示 template <typename Map> struct TriMaps { Map& next; Map& prev; Map& curr; }; 模板结构TriMaps { 地图与下一页; Map&prev; 地图和货币; }; 所以,TriMaps intTriMapsTriMaps-charTriMaps 那么,是否可能有一个不同类型的上述TriMaps容器?
map
,map
,等等),如下所示
template <typename Map> struct TriMaps
{
Map& next;
Map& prev;
Map& curr;
};
模板结构TriMaps
{
地图与下一页;
Map&prev;
地图和货币;
};
所以,TriMaps intTriMaps代码>TriMaps-charTriMaps代码>
那么,是否可能有一个不同类型的上述TriMaps容器?e、 g
vector <TriMaps> vecMaps;
矢量矢量地图;
哪些包含intTriMaps和charTriMaps?通常容器需要相同的类型。但我真的需要一个箱子。没有可用的boost或第三个库 首先确定并最终确定该类模板TriMaps
的预期用途。在C++中,必须初始化对某事物的引用。您可能需要非引用类型(或指针类型)。考虑:
template <typename Map>
struct TriMaps
{
Map next;
Map prev;
Map curr;
};
一种方法是引用一个全局变量(只是为了让它编译),或者通过构造函数获取一个int&
// Approach 1
int global;
class TriMap
{
int & ref_int;
public:
TriMap() : ref_int(global) {}
};
// Approach 2
class TriMap
{
int & ref_int;
public:
TriMap(int & outer) : ref_int(outer) {}
};
不能有不同类型的std::vector
但是如果你能有基类
struct TriMapBase { virtual ~TriMapBase() = default; };
template <typename Map> struct TriMaps : TriMapBase { /* Your implementation */ };
struct TriMapBase{virtual~TriMapBase()=default;};
模板结构TriMaps:TriMapBase{/*您的实现*/};
那么你可能有:
TriMapBase<std::map<int, int>> mapint;
TriMapBase<std::map<int, char>> mapchar;
std::vector<TriMapBase*> v = {&mapint, &mapchar};
TriMapBase-mapint;
TriMapBase-mapchar;
std::vector v={&mapint,&mapchar};
但是你必须使用虚拟函数
或dynamic\u cast
检索正确的类型。。。
或者使用是。您需要为TriMaps
指定参数类型,如向量向量映射
yes,但是特定的实例化(例如,TriMaps
)@jrok,TriMaps
只需要一个类型参数。你举了两个例子。@Ajay哦,对了。所以,vector
对不起,可能我没有足够清楚地描述我的问题。我想要的是一个容器,它可以包含不同的类型(map或map)。这是不可能的,因为容器的元素需要是相同的类型,除非我定义了一些基类。
class TriMap
{
int & ref_int;
};
// Approach 1
int global;
class TriMap
{
int & ref_int;
public:
TriMap() : ref_int(global) {}
};
// Approach 2
class TriMap
{
int & ref_int;
public:
TriMap(int & outer) : ref_int(outer) {}
};
struct TriMapBase { virtual ~TriMapBase() = default; };
template <typename Map> struct TriMaps : TriMapBase { /* Your implementation */ };
TriMapBase<std::map<int, int>> mapint;
TriMapBase<std::map<int, char>> mapchar;
std::vector<TriMapBase*> v = {&mapint, &mapchar};