Эта функция разбирает входную строку в аргумент, как это делает оболочка (bash, k sh, fi sh). Т.е. просматривает части входной строки, разделенные пробелами или табуляциями:
auto parse_args(string_view const& line){
vector<string_view> args;
size_t pos_begin = 0, pos_end = 0;
int i = 0;
while (pos_end < line.size() && pos_end != string_view::npos) {
pos_begin = line.find_first_not_of(" \t", pos_end);
if (pos_begin == string_view::npos)
break;
pos_end = line.find_first_of(" \t", pos_begin);
if (pos_end == string_view::npos)
pos_end = line.size();
args.emplace_back(line.substr(pos_begin, pos_end - pos_begin));
i++;
}
return args;
}
Результатом является набор представлений входной строки - vector<string_view>
. Ввод не изменился.
Глядя на C ++ 17 string_view
Я обнаружил, что большинство функций constexpr
. В моей функции только vector::push_back()
выполняется во время выполнения. Поэтому я решил сделать parse_args()
constexpr
, нужно заменить std::vector
контейнером constexpr.
Я искал способ добавить к initializer_list
или лучше сказать создать новый initializer_list поверх предыдущего, но без успеха. Пожалуйста, предложите способ для "push_back" до initializer_list
или std::array
или аналогичного контейнера constexpr. Я не ищу какой-либо большой сторонней библиотеки.