如何无需指定value_type从C++容器获取size_type?
解决方案
1. 已有容器实例时:用decltype直接推导
如果已经有容器对象,直接通过decltype获取size()方法的返回类型即可,完全不用手动写容器的完整模板参数:
std::map<char, int> letters; std::map<std::string, int> digraphs; // 获取letters的size_type using LettersSize = decltype(letters.size()); // 获取digraphs的size_type using DigraphsSize = decltype(digraphs.size());
这种方式最直接,也完全符合“正确”的类型获取方式,因为它直接对应容器实际使用的size_type。
2. 无容器实例时:封装通用模板特质
如果没有现成的容器实例,只是想获取某类容器(比如任意std::map或std::vector)的size_type,可以封装一个通用模板来避免重复写冗余的占位模板参数:
template <template <typename...> class Container> struct ContainerSizeType { // 用占位类型实例化容器,提取size_type using type = typename Container<int, int>::size_type; }; // 简化模板别名,方便使用 template <template <typename...> class Container> using container_size_type = typename ContainerSizeType<Container>::type; // 使用示例 using MapSizeType = container_size_type<std::map>; using VectorSizeType = container_size_type<std::vector>;
这个思路和你之前的“虚假实例”本质一致,但封装后复用性更强,不用每次手动构造std::map<int, int>这类临时类型。
补充说明
其实对于使用默认分配器的标准容器来说,size_type本质上都是std::size_t的别名——哪怕是特殊的std::vector<bool>也不例外。但如果坚持要严格从容器类型层面获取而非直接用std::size_t,上面两种方式都是合规的标准做法。
内容的提问来源于stack exchange,提问作者tbxfreeware
相关产品推荐
相关产品推荐

