关注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_type
是std::size_t
,那么std::vector<another_type>::size_type
是否有std::size_t
的可能性?仅检查分离文件中的一些常见类型是否足以确保std::container::size_type
在我的编译器上始终为std::size_t
?
注意:出于兼容性原因,我不使用C ++ 11.
答案 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(或兼容的 类型)。所以对于标准情况,它们是相同的。
所以,如果我是你,我会对我的编译器充满信心。但是,如果我确实使用了非标准的容器,那么我会费心去跟随你 - 就像你说的丑陋 - 接近一样,把它放在一个文件中,让它在一个隐藏的黑暗角落里完成它的工作。