返回vector大小的getter应该返回什么类型的值?
例如,我在以下类型的项目中有很多getter
我需要(int)
强制转换来删除编译警告:
int getNumberOfBuildings() const { return (int)buildings.size(); }
答案 0 :(得分:25)
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(); }
答案 1 :(得分:5)
您应该返回std::size_t
。使用默认分配器时,std::size_t
是vector<T>::size()
的返回类型。当您使用默认分配器(您最有可能使用的)时,vector<T>::size()
会返回vector<T>::size_type
,它只是std::size_t
的typedef。
答案 2 :(得分:3)
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(); }
答案 3 :(得分:3)
正如其他答案所述,正式答案确实是std::vector<Building>::size_type
。
真正的答案取决于您的程序中是否已有用于表示建筑物数量的类型。它可以是int
,可以是unsigned
,也可以是某个typedef名称TBuildingCount
。这是您在这种情况下应该使用的类型。它可能需要使用强制转换来抑制编译器警告,但这通常就是这样。
我没有看到你的其余代码,所以我不能肯定地说出来,但我猜这些建筑物存放在某个地方(或任何其他容器中)的事实只是一个实施细节,不应影响您对这些建筑物进行计数的类型选择。即使以使用其size_type
返回计数的间接方式,也无需暴露该包含者(或依赖它)的存在。
换句话说,如果您已经决定使用int
来计算建筑物,那么您的问题中的实施是您应该坚持的。
答案 4 :(得分:1)
与许多其他答案相比,您的功能的返回值实际上更多地取决于您的界面而不是您在引擎盖下使用的界面。你是否返回了矢量的大小并希望每个人都知道它?那么,继续使用std::vector::size_type
。但是你实际上是否正在返回一些抽象的计数变量,比如建筑物的数量,那么我不认为std::vector::size_type
属于你的界面,因为那只是一个实现细节。
如果它是你返回的某个东西的大小(但不是必须知道它是引擎盖下的矢量),我会使用好的旧std::size_t
,但如果它是某个东西,那么{{ 1}}在概念上更合适。当然,没有人保证unsigned int
或unsigned int
可以保持任意std::size_t
的大小,但是再次它不是任意std::vector
,它是一系列建筑物而你你自己应该知道是否有超过std::vector
建筑物。