Обтекание try / catch вокруг конструктора суперкласса позволяет вам ловушки исключений, которые бросаются в конструктор суперкласса; однако исключение автоматически восстанавливается при завершении блока catch
, и исключение продолжает распространяться.
В конце концов, суперкласс не строился. Это заставило исключение. Таким образом, вы не можете продолжать свой веселый путь, в конструкторе подкласса, а затем закончите с построенным подклассом, но с суперклассом, который не строился. Это не имеет никакого смысла.
Из http://en.cppreference.com/w/cpp/language/function-try-block :
Основной целью функции-try-blocks является регистрация или изменение, а затем восстановление данных, исключенных из списка инициализаторов членов в конструкторе. Они редко используются с деструкторами или с регулярными функциями.
blockquote>Это действительно основная добавленная функциональность блоков try-try: удобное место для регистрации «эй, эта функция породила исключение» , который охватывает всю функцию, единственное место для регистрации такого рода вещей, но не затрагивает обычную обработку исключений.
Пользование библиотекой диапазона-v3 Eric Niebler:
#include <string>
#include <iostream>
#include "range/v3/all.hpp"
int main()
{
std::string s = "user1:192.168.0.1|user2:192.168.0.2|user3:192.168.0.3";
auto words = s
| ranges::view::split('|')
| ranges::view::transform([](auto w){
return w | ranges::view::split(':');
});
ranges::for_each(words, [](auto i){ std::cout << i << "\n"; });
}
std::regex
А std::regex
может сделать строковое разделение в нескольких строках:
std::regex re("[\\|,:]");
std::sregex_token_iterator first{input.begin(), input.end(), re, -1}, last;//the '-1' is what makes the regex split (-1 := what was not matched)
std::vector<std::string> tokens{first, last};