此函数将输入行解析为参数,如 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_list
或std::array
类似的 constexpr 容器的方法。我不寻找任何大型第三方库。