簡體   English   中英

保證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在理論上是可能的,但我認為在我當前和未來的配置中並非如此。

但是,為了避免邪惡的錯誤,我在使用時檢查類型是否相同。 例如:

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'與'container :: size_type'提到:

標准容器將size_type定義為Allocator :: size_type(Allocator是模板參數)的typedef,std :: allocator通常定義為size_t(或兼容類型)。 所以對於標准情況,它們是相同的。


所以,如果我是你,我會對我的編譯器充滿信心。 但是,如果我確實使用了非標准的容器,那么我會費心去追你的 - 就像你說的丑陋 - 接近,把它放在一個文件中,然后讓它在一個隱藏的黑暗角落里完成它的工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM