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