你想要一些类似的东西
template<class StringType, typename type1, typename type2,
template<class, class> class MapType>
void readDatastructure(MapType<type1, type2> map, const StringType path);
但这不适用于,比如说,std::map
它有两个额外的模板参数(用于比较器和分配器)。所以你要么必须做
template<class StringType, typename type1, typename type2,
template<class...> class MapType>
void readDatastructure(MapType<type1, type2> map, const StringType path);
或添加额外的模板参数,即
template<class StringType, typename type1, typename type2, class C, class A,
template<class, class, class, class> class MapType>
void readDatastructure(MapType<type1, type2, C, A> map, const StringType path);
第一个仍然不适用于std::map
采用非默认比较器/分配器;如果您的地图没有完全四个模板类型参数,则第二个不起作用 - 例如unordered_map
,它有五个。
因此,最好让您的地图类型发布这些类型。std::map
,例如,将它们发布为key_type
和mapped_type
。通过“发布”,我的意思是将它们定义为成员 typedef。然后你可以写
template<class StringType, class MapType>
void readDatastructure(MapType map, const StringType path);
并使用例如,typename MapType::key_type
代替type1
.
如果您无法更改地图类型,并且它们不遵循标准协议,则可以编写一个特征类并将其专门用于您的地图类型:
template<class T>
struct map_traits {
using key_type = typename T::key_type;
using mapped_type = typename T::mapped_type;
};
template<class T1, class T2>
struct map_traits<MyBrokenMap<T1, T2>> {
using key_type = T1;
using mapped_type = T2;
};
然后你可以使用typename map_traits<MapType>::key_type
等。