【问题标题】:Templated Map/Dictionary Implementation模板化地图/字典实现
【发布时间】:2017-04-10 14:00:29
【问题描述】:

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

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

方法一:

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

这里的问题是我不能保证两个容器是一样的,用户可能会传递一个Array&lt;T, M&gt;作为键容器,一个Vector&lt;T&gt;作为值容器,一旦映射开始超过大小,就会导致问题在Array&lt;T, M&gt; 模板中指定。

方法二:

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>?
}

但正如我之前链接的问题中所展示的那样,这样做似乎是不可能的:接收具有不同参数计数的容器模板,除非有一些我不知道的巧妙模板技巧。

方法三:

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

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

【问题讨论】:

  • 为什么要为Map 指定一个容器?如果你想复制std::map 的功能,你需要实现一个RB-Tree。
  • 最优是什么意思?有什么限制?目标是什么?
  • @NathanOliver 忘了说我这样做是为了练习,所以我没有提到 STL 容器。至于为Map指定容器的问题,我希望这个类足够灵活,能够接受任何类型的容器实现。

标签: c++ templates dictionary containers


【解决方案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 的情况一样。

【讨论】:

  • 这很简洁,我从没想过这样使用using。 +1
【解决方案2】:

您可以将数据存储为:

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

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

【讨论】:

  • 我只是在尝试使用模板作为练习可以走多远,但在阅读了您的答案之后,似乎Container 模板参数是不必要的。 +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2020-08-27
  • 1970-01-01
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
相关资源
最近更新 更多