C++ 模板化映射/字典实现

C++ 模板化映射/字典实现,c++,templates,dictionary,containers,C++,Templates,Dictionary,Containers,这有点类似于我的上一篇文章,我试图实现一个模板映射类 template<typename T, size_t M> class Array { ... } // Fixed-size container template<typename T> class Vector { ... } // Variable-size container 模板类数组{…}//固定大小容器 模板类向量{…}//可变大小容器 方法1: template<typename KeyCo

这有点类似于我的上一篇文章,我试图实现一个模板映射类

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;
}
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>?
}
模板类映射
{
密钥容器密钥;
值容器值;
}
这里的问题是,我不能保证两个容器都是相同的,一旦贴图开始超过
数组
模板中指定的大小,用户可能会将
数组
作为关键容器传递,将
向量
作为值容器传递,从而导致问题

方法2:

template<typename KeyContainer, typename ValueContainer> class Map
{
    KeyContainer keys;
    ValueContainer values;
}
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:

template<typename KeyContainer, typename ValueContainer> class Map
{
    KeyContainer keys;
    ValueContainer values;
}
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,只需在文档中添加注释,告知用户
KeyContainer
ValueContainer
必须是相同类型的容器

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

您可以将数据存储为:

template <class Key, class Value, template<typename> class Container>
class Map
{
    Container<std::pair<Key, Value> > store;
};
模板
类图
{
货柜店;
};

免责声明:我个人认为这没有多大意义。我从来没有看到过更改
映射中使用的
容器的用例。您的
地图的任何用户也很难看到
容器的所有要求(例如
容器需要什么方法?哪些方法可能抛出?哪些是
常量?)在任何合理的场景中,用户都会使用您的一些默认
容器。在任何情况下,附加的模板参数都没有多大用处,这就是为什么我坚持使用特定的
容器
类型。

您可以将数据存储为:

template <class Key, class Value, template<typename> class Container>
class Map
{
    Container<std::pair<Key, Value> > store;
};
模板
类图
{
货柜店;
};

免责声明:我个人认为这没有多大意义。我从来没有看到过更改
映射中使用的
容器的用例。您的
地图的任何用户也很难看到
容器的所有要求(例如
容器需要什么方法?哪些方法可能抛出?哪些是
常量?)在任何合理的场景中,用户都会使用您的一些默认
容器。在任何情况下,附加的模板参数都没有多大用处,这就是为什么我坚持使用特定的
容器
类型。

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


但是,对于非类型模板参数,它不起作用,因为在
数组
的情况下,方法2是一个很好的解决方案,因为用户可以始终使用模板别名“绑定”模板参数:


但是,对于非类型模板参数,它就不能像
数组

那样工作了。为什么要为
映射指定一个容器?如果你想复制std::map的功能,你需要实现一个RB-Tree。你说的优化是什么意思?制约因素是什么?目标是什么?@NathanOliver忘了提到我做这项运动,这就是为什么我没有提到STL容器。至于为
映射指定容器的问题,我希望该类足够灵活,能够接受任何类型的容器实现。为什么要为
映射指定容器?如果你想复制std::map的功能,你需要实现一个RB-Tree。你说的优化是什么意思?制约因素是什么?目标是什么?@NathanOliver忘了提到我做这项运动,这就是为什么我没有提到STL容器。至于为
映射指定容器的问题,我希望该类足够灵活,能够接受任何类型的容器实现,但是在阅读了您的答案之后,似乎没有必要使用
容器
模板参数+1作为练习,我只是想尝试一下使用模板可以走多远,但在阅读了您的答案后,似乎没有必要使用
容器
模板参数+1这很好,我从来没有想过这样使用
+1这很好,我从来没有想过这样使用
+1.