所以我有这样的东西(C ++ 03):
class MyClass
{
// ...
}
class something
{
private:
std::vector<MyClass*> container;
// ...
}
// cmdarg can be anything, negative int too...
void something::foo(const std::string& cmdarg)
{
const int res = std::stoi(cmdarg);
if (res >= 0 && static_cast<std::vector<MyClass*>::size_type>(res) < this->container.size())
{
// ...
}
}
我想问一下从int
到std::vector<MyClass*>::size_type
的转换是否有效。 res >= 0
说它不是负数,所以我想转换为另一个非负数是可以的。
我的问题是,如果我写
if (res >= 0 && res < container.size())
由于有符号和无符号整数类型的比较,我得到警告。
我上面的代码(完整的代码)可以编译并且可以正常工作,但是我不确定。
谢谢。
答案 0 :(得分:1)
您的代码对于我的口味来说似乎太完美了。
打破现状:
const int res = std::stoi(cmdarg);
if (res >= 0 && static_cast<std::vector<MyClass*>::size_type>(res) < this->container.size())
用于检查零以下的if语句很好。我个人将其写为:
if (res < 0)
{
std::cerr << "Negative number " << res <<" given for ..., a positive was expected" << std::endl;
return -1;
}
这导致我们进入演员表:
auto unsigned_res = static_cast<std::vector<MyClass*>::size_type>(res);
但是,由于向量使用size_t
,因此大小始终为std::allocator
。在代码审查中,我请求将其更改为可读性:
auto unsigned_res = static_cast<std::size_t>(res);
最后,您确实可以对它进行比较:
if (unsiged_res < container.size())
// Do something
请注意,我同时提到了比较和强制类型转换,因为这需要按此顺序进行。最重要的是,当std::stoi
失败时,您还需要一些异常处理,请参见it's documentation
有关如何正确处理已签名/未签名的更多详细信息,我可以在ithare上推荐this article。