constexpr C++容器–一种将_back推送到initializer_list或类似内容的方法



此函数像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_liststd::array或类似的constexpr容器。我不寻找任何大型的第三方库。

由于这是在命令行args上运行的,所以制作这个constexpr几乎没有好处。如果它真的与非constexprchar*s一起使用,那么无论如何都不可能调用。

对于大多数应用程序代码来说,为constexpr做大量工作可能是多余的。

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

相关内容

最新更新