在我使用std::vector
编写的大多数程序中,我的大部分痛苦都在转换
int offset=(int)v.size();
unsigned int offset=(unsigned int)v.size();
令人遗憾的是,这些问题反映在许多其他问题中,例如this。
有没有办法重新布线std::vector
并强制它给出int
或unsigned int
之类的尺码?
int offset=v.size_i();
类型转换会使代码变得更加混乱。虽然,有些程序员喜欢它们,并且觉得每次演员都没有问题。
c++14
解决方案更受欢迎,但也欢迎使用c++17
解决方案。
如果某人建议更改变量的类型,则很快或迟到另一种类型转换必须发生。所以它没有解决问题。
请考虑这些难看的短语
function((int)myvar1.vec[32].size(),(int)myvar2.vec[32].size());
其中function
仅接受int
次。我无法控制它的定义。
答案 0 :(得分:4)
您可以继承std::vector
并重新实现size()
函数以返回签名值:
template<typename T, typename Alloc = std::allocator<T> >
class my_vector : public std::vector<T, Alloc>
{
using base_t = std::vector<T,Alloc>;
public:
using base_t::vector;
using base_t::operator =;
int size() const noexcept { return base_t::size(); }
};
答案 1 :(得分:2)
BaseClass
将成为std::vector<>.size()
。这是班级的连线方式,它甚至包括unsigned
类型,即typedef
。养成使用std::vector<>::size_type
抵消的习惯会好得多。
答案 2 :(得分:1)
在c ++ 20中,您可以使用std::ssize返回一个带符号的整数。
用作:
std::ssize(my_std_vector)
或:
my_std_vector.ssize()
将其引入标准库的建议为P1227R1。