确保std::container::size_type是std::size_t类型

5

在参考了这个问题后,我决定将每个容器的size_type都设置为std::size_t,以便提高可读性。尽管理论上来说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。


我同意“为什么?”它似乎size_t不能比vector<..>::size_type更小; 因此,容器返回的大小不适合size_t的风险不存在。 - Hans Olsson
1
关于std::vector<T>::size_type是否可以取决于类型的问题:如果sizeof(T)足够大,有人可能会尝试使用“unsigned short”作为size_type。我不知道这是否合法 - 或者为什么有人要费心去做这件事 - 但我认为这是不同size_type最现实的情况。 - Hans Olsson
是的,@Caduchon 如果这样的函数存在 - 但是 container::find 通常返回一个迭代器,而不是索引(并且在 vector 中不存在);因此我认为这不是标准容器的问题。 - Hans Olsson
@HansOlsson:这是std::string::find的情况;-) - Caduchon
@BoPersson:嗯...有趣的评论。实际上,我的目标是获取任何警告或错误以避免潜在的错误。我想在这种情况下,我会收到警告,表明存在问题吧? - Caduchon
显示剩余4条评论
1个回答

4

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

然而,我认为你过于担心了,因为 size_t 可以处理 size_type

如果你不幸遇到一个平台实现了 size_t,使其无法容纳所有 size_type 的值,那么我相信你将在任何尝试执行比较的地方收到编译器警告。

'size_t' vs 'container::size_type' 提到:

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


因此,如果我是你,我会对我的编译器有信心,它会处于典型情况下。然而,如果我使用非标准容器,那么我会费心去遵循你所说的丑陋的方法,将它放在一个文件中,在一个隐藏的黑暗角落里完成它的工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接