返回矢量大小的 getter 应该返回什么类型的值

What type of value should it be returned by getters that return size of vector?

本文关键字:返回 什么 类型 getter      更新时间:2023-10-16

返回向量大小的 getter 应该返回什么类型的值?

例如,我的项目中有许多以下类型的 getter,并且我需要(int)强制转换来删除编译警告:

int getNumberOfBuildings() const { return (int)buildings.size(); }

C++03 方式:

std::vector<Building>::size_type getNumberOfBuildings() const
{ return buildings.size(); }

C++11 方式:

auto getNumberOfBuildings() const -> decltype(buildings.size())
{ return buildings.size(); }

C++14 方式:

auto getNumberOfBuildings() const
{ return buildings.size(); }

你应该返回一个std::size_tstd::size_t是使用默认分配器时返回的vector<T>::size()类型。 vector<T>::size()返回vector<T>::size_type,这只是使用默认分配器(您最有可能使用(时std::size_t的 typedef。

std::vector提供了一个typedef,std::vector<>::size_type,指示哪个类型是用作vector::size结果的类型:

std::vector<TYPE>::size_type getNumberOfBuildings() const { return buildings.size(); }

但是,这通常是size_t,因此您可以继续直接使用后者:

#include <cstddef>
std::size_t getNumberOfBuildings() const { return buildings.size(); }

正式的答案确实是std::vector<Building>::size_type的,正如其他答案所述。

真正的答案取决于您的程序中是否已经有一个用于表示建筑物数量的类型。它可能是int,可能是unsigned的,也可能是某个typedef名称TBuildingCount。在这种情况下,您应该使用这种类型。它可能需要强制转换来禁止编译器警告,但通常是这样。

我没有看到你的代码的其余部分,所以我不能肯定地说,但我猜建筑物存储在某个向量中(或任何其他容器(的事实只是一个实现细节,这不应该影响你选择的类型来计算这些建筑物。没有必要公开该包含器的存在(或依赖它(,即使以间接的方式,例如使用其size_type返回计数。

换句话说,如果您已经决定使用int来计算建筑物,那么您应该坚持使用问题中的实现。

与许多其他答案相比,函数的返回值实际上更多地取决于您的接口,而不是您在引擎盖下使用的内容。您是否返回了向量的大小并希望每个人都知道它?好吧,然后继续使用std::vector::size_type.但是你是否真的返回了一些抽象的计数变量,比如建筑物的数量,那么我认为std::vector::size_type不属于你的接口,因为这只是一个实现细节。

如果它是你返回的东西的大小(但不一定知道是引擎盖下的向量(,我会使用好的旧std::size_t,但如果它是某物的计数,那么unsigned int在概念上更合适。当然,没有人能保证一个unsigned intstd::size_t可以容纳任意std::vector的大小,但话又说回来,它不是一个任意的std::vector,它是一个建筑物的阵列,你自己应该知道是否可以有超过std::numeric_limits<unsigned int>::max()个建筑物。