c ++中模板类的容器

时间:2014-10-16 12:04:04

标签: c++ templates metaprogramming

我有一个模板,可以与不同的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?通常容器需要相同的类型。但我真的需要一个容器来支持我的情况。没有提升或第三个库可用。

2 个答案:

答案 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以后检索正确的类型... 或使用