Контейнер constexpr C ++ - способ push_back в initializer_list или аналогичный - PullRequest
1 голос
/ 30 марта 2020

Эта функция разбирает входную строку в аргумент, как это делает оболочка (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. Я не ищу какой-либо большой сторонней библиотеки.

1 Ответ

0 голосов
/ 30 марта 2020

Так как он работает на аргументах командной строки, создание этого constexpr мало что дает. Если он действительно используется с не-constexpr char* с, то в любом случае было бы невозможно позвонить.

Для большинства кодов приложений выход из положения для constexpr, вероятно, излишний.

При этом вы можете определить std::array с указанной верхней границей (скажем, 1000) и предположить, что вы не переполнены.

...