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

Cad*_*hon 5 c++ stl size-t size-type c++03

下面这个问题,我决定使用std::size_t作为size_type每一个容器,明显可读性的原因.我知道理论上可能std::container<T>::size_type不是std::size_t,但我认为现在和未来的配置并非如此.

但是,为了避免邪恶的错误,我在使用时检查类型是否相同.例如:

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 */ }
Run Code Online (Sandbox Code Playgroud)

在代码中的另一个地方,我用了一个std::vector<long int>,然后我也检查:

BOOST_STATIC_ASSERT(boost::is_same< std::vector<long int>::size_type , std::size_t >::value);
Run Code Online (Sandbox Code Playgroud)

然后,哦不!我用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);
Run Code Online (Sandbox Code Playgroud)

好的,我想你明白了这个问题.线条难看,难以维护代码.这是个坏主意.

然后,我的问题是:如果我检查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.

gsa*_*ras 4

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

不过,我觉得你担心太多了,既然size_t可以应付size_type

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

'size_t' 与 'container::size_type'提到:

标准容器将 size_type 定义为 Allocator::size_type 的 typedef(Allocator 是一个模板参数),对于 std::allocator 通常定义为 size_t (或兼容类型)。因此对于标准情况,它们是相同的。


所以,如果我是你,我会对我的编译器在典型情况下的表现充满信心。但是,如果我确实使用非标准容器,那么我会费心遵循您的 - 正如您所说的丑陋 - 方法,将其放入文件中并让它在隐藏的黑暗角落中完成其工作。