Сравнение enum и string C++

129
05 апреля 2019, 18:30

Собсна, стоит задача: оформить функцию bool parseUrl(const string & url, Protocol & protocol, const unsigned int & port, const string & host, const string & document), которыая будет определять правильность введенной гиперссылки. Обозначено, что протокол есть перечисляемый тип:

enum Protocol { HTTP, HTTPS, FTP };

И я вообще не могу сообразить как справиться с протоколом. Как я понимаю, нужно сначала вырезать из строки часть, обозначающий протокол. А дальше? Что-то с чем-то сравнивать?

Answer 1

Разбираете исходную строку, достаете оттуда часть с протоколом, это все что слева до символа : (тут могу ошибаться) и делаете функцию вроде такой:

Protocol str2Protocol(const std::string& value)
{
    if      (value == "HTTP")  return Protocol::HTTP;
    else if (value == "HTTPS") return Protocol::HTTPS;
    else if (value == "FTP")   return Protocol::FTP;
    else return Protocol::unknown; // or throw exception
}

А в коде будет как-то так:

Protocol proto = str2Protocol(protocol_str);
if (proto  == Protocol::unknown)
{
    //show error
}

Дополнительно добавить case-insensitive сравнение и проверки. Эксепшны или unknown элемент перечисления - дело вкуса. Если enum задан где-то в другой либе и его нельзя изменить, то вместо else return Protocol::unknown; следует бросить исключение Unknown protocol, которое потом можно обработать и показать ошибку

READ ALSO
Разные результаты одинаковых функций

Разные результаты одинаковых функций

Почему следующая программа выводит 1 0, хотя вроде бы одинаковые проверки?

144
Разница между addressof и &

Разница между addressof и &

В чём разница между std::addressof<>(var) и &var?

140
Почему не считывается файл?

Почему не считывается файл?

Есть файл со следующим содержанием текста:

194