c++ - 也接受模板的模板参数(嵌套模板)

标签 c++ templates template-templates

我正在努力避免代码重复,原因如下:

template<class StringType, typename type1, typename type2, class MapType>
void readDatastructure(MapType<type1, type2> map, const StringType path) {
... some code
}

我有几种不同的 map 类型,它们具有不同的 type1type2 参数。在某些时候,我想静态检查哪些类型是 type1type2,但我不知道如何编译它。我已经对该模板声明尝试了几种变体,但似乎都不起作用。这可能吗?

干杯,

最佳答案

你想要类似的东西

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_typemapped_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/

相关文章:

c++ - vector 迭代器不是增量的

c++ - 海湾合作委员会错误 : invalid conversion from double* to const double

javascript - 如何从 Webix 组合中选定的数据项获取属性?

c++ - 包含类型的类型的模板函数重载

c++ - 在 C++ 中更改模板模板参数

java - 用于流量控制的 Log4X

c++ - Vim:将连续的行与空格对齐

c++ - 将可变参数模板参数解包到初始化列表中

c++ - 无法推断模板参数( vector 、std::function)

c++ - MSVC 中的模板模板参数错误,但不是 Clang。为什么?