返回向量大小的getter应该返回什么类型的值?
例如,我的项目中有许多以下类型的getter,我需要使用(int)
强制转换来消除编译警告:
int getNumberOfBuildings() const { return (int)buildings.size(); }
返回向量大小的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_t
类型。当您使用默认分配器时,std::size_t
是vector<T>::size()
的返回类型。 vector<T>::size()
返回vector<T>::size_type
,这只是std::size_t
的一个typedef,当您使用默认分配器时(这很可能是您正在使用的)。
vector::size_type
,它是分配器的size_type
的别名,而size_type
本身是size_t
的别名。如果您有自定义的分配器,它可能会有所不同。 - Oliver Charlesworthstd::allocator
)已经足够好了。 - JKorstd::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(); }
auto
关键字:auto temp = myObject.getNumberOfBuildings();
。 - mfontaninistd::vector<Building>::size_type
,正如其他答案所述。int
,也可以是unsigned
,或者它可能是一些typedef名称TBuildingCount
。在这种情况下,您应该使用此类型。它可能需要一个转换以消除编译器警告,但通常都是这样。size_type
的间接方式公开该容器的存在(或依赖它)来返回计数。int
来计算建筑数量,那么您在问题中的实现是您应该坚持的。static_cast
(有助于某些类型的代码搜索)或boost::numeric_cast
(断言前提条件/类不变量,即当前值必须适合于int
)。 - Steve Jessopstd::vector::size_type
。但是,如果您实际上返回一些抽象计数变量,例如建筑物的数量,那么我认为std::vector::size_type
不应该出现在您的接口中,因为那只是一种实现细节。std::size_t
,但如果你返回的是某个东西的数量,那么一个unsigned int
在概念上更加合适。当然,没有人保证unsigned int
或std::size_t
可以容纳任意std::vector
的大小,但再次强调,这不是任意的std::vector
,它是一组建筑物,您自己应该知道是否会有超过std::numeric_limits<unsigned int>::max()
的建筑物。
std::size_t
是安全的,但是理论上这并不是可移植的,因为标准没有规定对于任何T
,std::size_t
应该与std::vector<T>::size_type
相同。另外,在使用GCC 4.8.1和Clang 3.3编译时,如果使用-std=c++1y
标志,则可以使用最后一种形式。 - Andy Prowlsize_type
而不是decltype
,但它们都提供相同的结果,所以并没有太大关系。 - chrisstd::allocator<T>::size_type
是size_t
,并且它遵循std::vector<T>::size_type
也是size_t
。标准没有说std::vector<T,Alloc>::size_type
对于任何Alloc
都是size_t
,所以你是正确的,可能会有其他大小类型的向量。 - Steve Jessop