我正在努力避免代码重复,原因如下:
template<class StringType, typename type1, typename type2, class MapType>
void readDatastructure(MapType<type1, type2> map, const StringType path) {
... some code
}
我有几种不同的 map 类型,它们具有不同的 type1
和 type2
参数。在某些时候,我想静态检查哪些类型是 type1
和 type2
,但我不知道如何编译它。我已经对该模板声明尝试了几种变体,但似乎都不起作用。这可能吗?
干杯,
最佳答案
你想要类似的东西
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
采用非默认比较器/分配器;如果您的 map 没有恰好有四个模板类型参数,则第二个不起作用 - 例如unordered_map
, 其中有五个。
因此,最好让您的 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
.
如果您不能更改您的 map 类型,并且它们不遵循标准协议(protocol),您可以编写一个特征类并针对您的 map 类型专门化它:
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
等等
关于c++ - 也接受模板的模板参数(嵌套模板),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37169224/