模板化地图/字典实现

时间:2017-04-10 14:00:30

标签: c++ templates dictionary containers

这有点类似于我之前的question,我正在尝试实现模板化的Map类。

template<typename T, size_t M> class Array { ... } // Fixed-size container
template<typename T> class Vector { ... } // Variable-size container

方法1:

template<typename KeyContainer, typename ValueContainer> class Map
{
    KeyContainer keys;
    ValueContainer values;
}

这里的问题是我不能保证两个容器都是相同的,用户可以传递Array<T, M>作为密钥容器,Vector<T>作为值容器,一旦Map启动就会导致问题超出Array<T, M>模板中指定的大小。

方法2:

template<typename KeyType, typename ValueType, template<typename> class Container> class Map
{
    Container<KeyType> keys;
    Container<ValueType> values;
    // What if Container is an Array<T, M>?
}

但正如我在上一个问题中证明的那样我联系它似乎不可能这样做:接收一个具有不同参数计数的容器模板,除非有一些我不知道的聪明的模板技巧。

方法3:

实施方法1 ,只需在文档中添加一条注释,告诉用户KeyContainerValueContainer必须是同一类型的容器。

问题: 什么是解决这个问题的最佳方式?

2 个答案:

答案 0 :(得分:1)

您可以将数据存储为:

template <class Key, class Value, template<typename> class Container>
class Map
{
    Container<std::pair<Key, Value> > store;
};

免责声明:就我个人而言,我认为这没有多大意义。我没有看到用于更改Container中使用的Map的用例。您Map的任何用户都很难看到Container的所有要求(例如,Container需要哪些方法?哪些可能会抛出?哪些是{{1}在任何合理的情况下,用户都会使用你的一些默认const。在任何情况下,额外的模板参数都不会有太多用处,这就是我坚持使用特定Container类型的原因。

答案 1 :(得分:1)

方法2 是一个很好的解决方案,因为用户可以使用模板别名始终“绑定”模板参数

template <typename T>
using ArrayOf5 = Array<T, 5>;

int main()
{
    Map<int, float, ArrayOf5> m;
}

live wandbox example

您可以使用可变参数包允许Container获取更多模板参数

template <typename...> class Container

但是对于非类型模板参数,它不适用于Array