保证 std::container::size_type 是 std::size_t

Guarantee that std::container::size_type is a std::size_t

之后,出于明显的可读性原因,我决定对每个容器使用 std::size_t 作为 size_type。我知道理论上 std::container<T>::size_type 不是 std::size_t 是可能的,但我认为在我当前和未来的配置中情况并非如此。

但是,为了避免恶意bug,我在使用的时候会检查类型是否相同。例如:

BOOST_STATIC_ASSERT(boost::is_same< std::vector<double>::size_type , std::size_t >::value);
std::vector<double> x;
/* fill x */
for(std::size_t i = 0; i < x.size(); ++i) { /* do something */ }

代码中还有一个地方,我用了一个std::vector<long int>,那我也查一下:

BOOST_STATIC_ASSERT(boost::is_same< std::vector<long int>::size_type , std::size_t >::value);

然后,哦不!我使用 std::vector<std::list<std::string>*>std::vector<std::list<double*>*>,然后我检查:

BOOST_STATIC_ASSERT(boost::is_same< std::vector<std::list<std::string>*>::size_type , std::size_t >::value);
BOOST_STATIC_ASSERT(boost::is_same< std::vector<std::list<double*>*>::size_type , std::size_t >::value);

好的,我想你明白问题所在了。丑陋的线条,难以维护的代码。这是个坏主意。

那么,我的问题是:如果我检查 std::vector<any_common_type>::size_typestd::size_t,是否有可能 std::vector<another_type>::size_type 不是 std::size_t?仅检查单独文件中的一些常见类型以确保 std::container::size_type 在我的编译器上始终是 std::size_t 是否足够?

注意:出于兼容性原因,我不使用 C++11。

如果您真的需要这样做,您在问题中遵循的方法似乎是可行的方法。

不过,我觉得你多虑了,因为 size_t 可以处理 size_type

如果您发现自己处于不太可能的情况下,即平台实现 size_t 的方式不足以包含 size_type 的所有值,那么我很确定您将在您尝试执行的任何比较中收到编译器警告。

'size_t' vs 'container::size_type' 提及:

The standard containers define size_type as a typedef to Allocator::size_type (Allocator is a template parameter), which for std::allocator is typically defined to be size_t (or a compatible type). So for the standard case, they are the same.


所以,如果我是你,我会相信我的编译器在典型情况下会撒谎。但是,如果我确实使用了非标准容器,那么我会费心去遵循你的——正如你所说的丑陋的——方法,把它放在一个文件中,让它在一个隐藏的黑暗角落里完成它的工作。