我有一个像这样模板化的地图访问者
template <class Map> class MyVisitor : public MyMapVisitor<Map>;
Map必须是std :: map
我希望在其中有一个方法,我想创建一个存储在我的地图中的所有成员的列表:
std::vector <Map::*second_template_argument*> toList ();
有办法做到这一点吗?因为我不允许更改MyMapVisitor超类但我可以更改MyVisitor子类。
答案 0 :(得分:8)
对于std :: map,您有三个选择:
答案 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();