如何使用 span 来包装命令行参数

Nic*_*els 2 c++ string-view c++20 std-span

即将推出的 C++20 的这种使用是否std::span正确并且没有开销来包装命令行参数?

#include <iostream>
#include <span>

int main(int argc, const char* argv[])
{
    for (auto s : std::span { argv, static_cast<std::size_t>(argc) })
      std::cout << s << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

如果它是正确的,我可以进一步使用 withstd::string_view吗?

Bar*_*rry 5

如果你使用()而不是{}你不需要真正冗长的强制转换:

std::span(argv, argc)
Run Code Online (Sandbox Code Playgroud)

这为您提供了一系列char const*. 您可以将它们转换string_view为使用transform. 这有一些开销,因为你需要做很多strlen事情:

std::span(argv, argc)
    | std::views::transform([](char const* v){ return std::string_view(v); })
Run Code Online (Sandbox Code Playgroud)

对于这样的东西,我有一个执行转换的函数对象,这很容易编写,所以这可能是:

std::span(argv, argc)
    | std::views::transform(static_cast_<std::string_view>)
Run Code Online (Sandbox Code Playgroud)