Обработка int и std :: vector :: size_type в сравнении - PullRequest
1 голос
/ 10 ноября 2019

Итак, у меня есть что-то вроде этого (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())

, я получу предупреждение,из-за сравнения с целочисленными типами со знаком и без знака.

Мой код выше (полный) компилируется и, кажется, работает, но я не уверен.

Спасибо.

1 Ответ

0 голосов
/ 10 ноября 2019

Ваш код выглядит на мой вкус слишком идеальным.

Разбивка:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...