我有一个模板,可以与不同的stl地图(map<int, int>
,map<int, char>
等)一起使用,如下所示。
template <typename Map> struct TriMaps
{
Map& next;
Map& prev;
Map& curr;
};
所以,TriMaps<init, int> intTriMaps;
TriMaps<int, char> charTriMaps;
那么,是否有可能拥有上述TriMaps的容器,不同类型? e.g。
vector <TriMaps> vecMaps;
包含intTriMaps和charTriMaps?通常容器需要相同的类型。但我真的需要一个容器来支持我的情况。没有提升或第三个库可用。
答案 0 :(得分:1)
首先确定并确定此类模板TriMaps
应该执行的操作。在C ++中,您必须初始化对某事物的引用。您可能需要非引用类型(或指针类型)。考虑:
template <typename Map>
struct TriMaps
{
Map next;
Map prev;
Map curr;
};
用法:
TriMaps<int> IntMaps;
vector<TriMaps<int>> iv;
如果您需要两个模板类型参数,可以这样做:
template <typename MapType1, typename MapType2>
struct TriMaps
{
MapType1 a;
Maptype2 b;
};
用法:
TriMaps<int, float> IntMaps;
vector<TriMaps<int, float>> iv;
修改强>
请仔细了解以下简单类不会编译。
class TriMap
{
int & ref_int;
};
一种方法是引用全局变量(只是为了使其编译),或者通过构造函数获取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) {}
};
答案 1 :(得分:0)
您不能拥有std::vector
不同类型的
但是如果你有基类
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};
但您必须使用虚拟功能
或dynamic_cast
以后检索正确的类型...
或使用