Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+中模板类的容器+;_C++_Templates_Metaprogramming - Fatal编程技术网

C++ c+中模板类的容器+;

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容器?

我有一个模板,可以用于不同的stl映射(
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};