这有点类似于我之前的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 ,只需在文档中添加一条注释,告诉用户KeyContainer
和ValueContainer
必须是同一类型的容器。
问题: 什么是解决这个问题的最佳方式?
答案 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;
}
您可以使用可变参数包允许Container
获取更多模板参数:
template <typename...> class Container
但是对于非类型模板参数,它不适用于Array
。