Функция конвертирует std::string в тип T. Передача "-1" в числовые типы считается ошибкой. Передача "Abc" в char тоже.
template<class T>
T from_string(std::string const& s)
{
try
{
T obj;
if (! (std::istringstream(s) >> std::noskipws >> obj) ) throw new bad_from_string(s);
return obj;
}
catch (const std::exception& ex) {}
}
Обработчик ошибок:
class bad_from_string : public std::runtime_error
{
public:
bad_from_string(const char* msg) : std::runtime_error(msg) {}
bad_from_string(std::string const& msg) : std::runtime_error(msg.c_str()) {}
const char* msg;
};
Вопрос: как отловить передачу в char более, чем одного символа и передачу в численные типы числа со знаком "-"?
В отмеченных случаях char должен выдавать ошибку
Начнем с вашего класса:
Во первых неинициализирован указатель msg
, не говоря о том, что он тут вообше не нужен.
Во вторых, класс, хранящий указатель, должен иметь определение деструктора, КК и ОП.
И наконец: std::runtime_error
принимает как С_строку, так и std::string, а последный, в свою очередь может инициализироваться С_строкой, так что одного единственного конструктора достаточно. И старайтесь придать разные имена аргументу конструктора и члену класса, чтобы потом самы не запутались. Нормально bad_from_string
может выглядеть:
struct bad_from_string : public std::runtime_error
{
bad_from_string(std::string const& msg) : std::runtime_error(msg) {}
};
Теперь о вашей функции: она генерирует исключение и сама же ловит. Во первых смысла в этом абсолютно нет, поскольку исключения генерируются, чтобы вызывающая функция обрабатывала и получала нужный результат. Во вторых: если исключение поймано, то ваша функция не закончит свою работу, а значит не вернет ничего, но она должна возвращать обьект.
Так что уберите try/catch
из функции и включите в программу(вызывающую функцию). А если вы хотите читать из потока так, как вам хочется, то нужно написать еще и парсер.
P.S. Чуть не забыл: не нужно генерировать исключение, созданное в куче, поскольку в этом нет нужды, плюс иначе вам придется не забывать производить удаление в обработчике, и вы все таки пытаетесь обработать не по указателью, а по ссыльке.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Не понимаю почему компилятор выдаёт, что я не назначил что-то в функцииОбъясните, как это делать правильно (уже который раз с этим сталкиваюсь)
У меня есть List<String> со значениями например ["a", "a", "a", "b", "c", "c", "d", "d", "d"] из него должно получиться ["a", "b", "d"]Причём, если после удаления дубликатов...