Ваш код выглядит на мой вкус слишком идеальным.
Разбивка:
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_type этот вектор всегда size_t
, поскольку он использует std::allocator
. В обзоре кода я бы попросил изменить это для удобства чтения на:
auto unsigned_res = static_cast<std::size_t>(res);
Наконец, вы действительно можете сравнить его:
if (unsiged_res < container.size())
// Do something
Обратите внимание, что я упомянул как сравнение, так ибросить, как это должно произойти в таком порядке. Кроме того, вам также потребуется некоторая обработка исключений для случаев, когда std::stoi
терпит неудачу, см. это документация
Для получения дополнительной информации о том, как правильно обращаться с подписанным / неподписанным, я могу порекомендовать эта статья на ithare.