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

C++ 如何使用span包装命令行参数,c++,c++20,string-view,std-span,C++,C++20,String View,Std Span,使用即将推出的C++20std::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::

使用即将推出的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;
}
#包括
#包括
int main(int argc,const char*argv[]
{
for(auto s:std::span{argv,static_cast(argc)})
std::cout如果使用
()
而不是
{}
,则不需要真正冗长的强制转换:

std::span(argv, argc)
这为您提供了一个
char-const*
范围。您可以使用
transform
将其转换为
string\u-view
。这会带来一些开销,因为您需要执行一系列
strlen
操作:

std::span(argv, argc)
    | std::views::transform([](char const* v){ return std::string_view(v); })
对于这样的东西,我有一个函数对象来执行强制转换,这很容易编写,所以这可能是:

std::span(argv, argc)
    | std::views::transform(static_cast_<std::string_view>)
std::span(argv,argc)
|std::views::transform(静态转换)

我不会称之为“无开销”,考虑到每次访问这个范围都需要做
strlen
@nicolabolas这就是…我说的?太好了!很抱歉问题的“无开销”部分,我考虑分配,因为我以前使用的是
vector
,strlen
要好得多。