C ++有没有办法获取模板类型?

时间:2014-06-10 17:17:50

标签: c++ templates

我有一个像这样模板化的地图访问者

template <class Map> class MyVisitor : public MyMapVisitor<Map>;

Map必须是std :: map

我希望在其中有一个方法,我想创建一个存储在我的地图中的所有成员的列表:

std::vector <Map::*second_template_argument*> toList ();

有办法做到这一点吗?因为我不允许更改MyMapVisitor超类但我可以更改MyVisitor子类。

4 个答案:

答案 0 :(得分:8)

对于std :: map,您有三个选择:

  • std :: map :: value_type,这是一个键/值对
  • std :: map :: key_type为键
  • std :: map :: mapped_type表示映射值。

答案 1 :(得分:1)

对于更一般的情况,如果类不足以为其模板类型提供typedef,则可以使用decltype(如果您有C ++ 11)。对于map示例,您可以这样做:

std::map<int, double> myMap;

typedef decltype(myMap.begin()->second) valueType; // double
std::vector<valueType> myVector;

请注意,此代码myMap.begin()实际上不是名称; decltype表达式只是评估myMap.begin()->second 将返回的类型(在这种情况下为double)。

显然,拥有它们时依赖typedef会更好!

答案 2 :(得分:0)

没有。你所描述的是不是传递类型而是传递类的成员的能力。这可以在运行时传递,但是无法将成员的名称作为模板参数传递。

答案 3 :(得分:0)

有几种方法。首先是使implmenetation成为一种专业化。

template <class MapType> class MyVisitor;

template <class T, class J>
class MyVisitor<Map<T,J>>: public MyMapVisitor<Map<T,J>>
{
  std::vector<J> toList();
}

我个人不喜欢这个,但有时候它就是你所拥有的。

第二种是通过public typedef公开类型(vector的方式):

template <typename T, typename J>
struct MyMap
{
  typedef T sometype;
  typedef J someothertype;
}

然后

std::vector<Map::someothertype> toList();