此函数像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()
在运行时执行。所以我解决了使parse_args()
成为constexpr
,需要用constexpr容器替换std::vector
的问题
我寻找了一种方法来附加到initializer_list
,或者更好地说,在前一个的基础上创建新的initializer_list,但没有成功。请建议一种方法"push_back"到initializer_list
或std::array
或类似的constexpr容器。我不寻找任何大型的第三方库。
由于这是在命令行args上运行的,所以制作这个constexpr几乎没有好处。如果它真的与非constexpr
char*
s一起使用,那么无论如何都不可能调用。
对于大多数应用程序代码来说,为constexpr
做大量工作可能是多余的。
话虽如此,您可以定义一个具有指定上限(例如1000(的std::array
,并假设您没有溢出。