1

此函数将输入行解析为参数,如 shell(bash,ksh,fish) 所做的。即查看由空格或制表符分隔的输入字符串部分:

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()在运行时执行。所以我解决了 make parse_args() constexpr,需要std::vector用 constexpr 容器替换。
我寻找一种方法来追加initializer_list或更好地说在前一个之上创建新的 initializer_list,但没有成功。 请建议一种将“push_back”到initializer_liststd::array类似的 constexpr 容器的方法。我不寻找任何大型第三方库。

4

1 回答 1

1

由于这是在命令行参数上运行的,因此制作这个 constexpr 几乎没有好处。如果它真的与非constexpr char*s 一起使用,那么无论如何都无法调用。

对于大多数应用程序代码来说,走远路constexpr可能是多余的。

话虽如此,您可以std::array使用指定的上限(例如 1000)定义 an,并假设您没有溢出。

于 2020-03-30T14:24:48.390 回答