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

时间:2017-09-07 08:49:01

标签: c++ stl c++03 size-t size-type

关注this question,出于显而易见的可读性原因,我决定将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 */ }

代码中的另一个地方,我使用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.

1 个答案:

答案 0 :(得分:4)

如果您真的需要这样做,那么您在问题中遵循的方法似乎是要走的路。

但是,我认为你太担心,因为size_t可以处理size_type

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

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

  

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

所以,如果我是你,我会对我的编译器充满信心。但是,如果我确实使用了非标准的容器,那么我会费心去跟随你 - 就像你说的丑陋 - 接近一样,把它放在一个文件中,让它在一个隐藏的黑暗角落里完成它的工作。