【问题标题】:How to use span to wrap up command line args如何使用 span 来包装命令行参数
【发布时间】:2020-09-24 20:47:31
【问题描述】:

对即将推出的 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;
}

如果正确,我可以继续使用std::string_view吗?

【问题讨论】:

    标签: c++ c++20 string-view std-span


    【解决方案1】:

    如果您使用() 而不是{},则不需要真正冗长的演员表:

    std::span(argv, argc)
    

    这为您提供了char const* 的范围。您可以使用transform 将这些转换string_view。这有一些开销,因为你需要做一堆strlens:

    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>)
    

    【讨论】:

    • 我不会称其为“无开销”,因为每次访问此范围都需要执行strlen
    • @NicolBolas 那是……我说的是什么?
    • 太棒了!抱歉问题的“无开销”部分,我正在考虑分配,因为我之前使用的是vector&lt;string&gt;strlen 要好得多。
    猜你喜欢
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 2016-07-04
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 2010-12-18
    相关资源
    最近更新 更多