是否有从 C++ 容器获取“size_type”的通用方法?

tbx*_*are 4 c++ containers templates size-type

是否可以size_type从容器中获取类型别名,例如std::vectorstd::map不提供value_type某种类型的 a ?

我正在编写一个程序,我需要size_type两种不同map类型的数据。但是,如果我为第一个映射类型创建 typedef,则该名称size_type对于第二个映射类型不可用。我的解决方法(又名“拼凑”)解决方案是说谎。

std::map<char, int> letters;
std::map<std::string, int> digraphs, trigraphs;

// This lie is good enough for both map types.
using size_type = typename std::map<int, int>::size_type;
Run Code Online (Sandbox Code Playgroud)

在其他情况下,我只是不想提供value_type. 这是一个人为的例子。

// Yes, I know this can be cleaned up by doing it in stages, but ugh!
using size_type = typename std::map<std::string, std::pair<std::string, std::string>>::size_type;
Run Code Online (Sandbox Code Playgroud)

最终,我们都知道size_type可能会成为 的别名std::size_t,即使在诸如 之类的极端情况下也是如此std::vector<bool>。尽管如此,我仍然尝试使用“正确”的方式做事size_type

那么,有没有一种方法可以size_type不提供而获得value_type呢?

use*_*522 6

那么,有没有办法在不提供 value_type 的情况下获取 size_type 呢?

不,因为size_type每个 可以是不同的类型value_type

当然,正如您自己所说,通常情况并非如此,而且size_type几乎总是这样std::size_t,但是标准库实现本身以及容器模板的用户定义的专业化都允许size_type针对不同的情况进行不同的定义value_type,并且没有要求它必须与 相关std::size_t

甚至没有任何要求size_type必须小于或大于std::size_t。如果您希望拥有可与任何符合标准的实现一起使用的通用库代码,则必须始终size_type单独考虑并且不对它们的关系做出任何假设。