You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++17中std::string_view的可变替代方案是否存在?

C++17中std::string_view的可变替代方案

C++17标准库里没有现成的、和std::string_view对等的可变视图类型,但有几个可行的方向:

  • 自行实现轻量级可变视图
    这种实现非常简单,核心就是存储指针和大小,再封装必要的访问接口,完全符合你的需求:无堆分配、能包装静态数组、堆数组或数组切片,且兼容C++17。示例代码如下:

    template <typename T>
    class mutable_span {
    public:
        // 从指针和大小构造
        constexpr mutable_span(T* ptr, size_t size) : ptr_(ptr), size_(size) {}
        // 从静态数组自动推导大小
        template <size_t N>
        constexpr mutable_span(T (&arr)[N]) : ptr_(arr), size_(N) {}
    
        // 可变和不可变的下标访问
        constexpr T& operator[](size_t idx) noexcept { return ptr_[idx]; }
        constexpr const T& operator[](size_t idx) const noexcept { return ptr_[idx]; }
    
        // 迭代器支持
        constexpr T* begin() noexcept { return ptr_; }
        constexpr const T* begin() const noexcept { return ptr_; }
        constexpr T* end() noexcept { return ptr_ + size_; }
        constexpr const T* end() const noexcept { return ptr_ + size_; }
    
        // 基础属性查询
        constexpr size_t size() const noexcept { return size_; }
        constexpr bool empty() const noexcept { return size_ == 0; }
    
    private:
        T* ptr_;
        size_t size_;
    };
    

    这个类可以像std::string_view一样使用,但允许修改指向的元素,完全满足你替代“指针+大小”传参的需求。

  • 第三方库的成熟实现
    如果你能引入第三方库,Boost的boost::span是个不错的选择——它是C20 std::span的前身,早在C17环境下就可以使用,默认就是可变视图(不可变版本用boost::span<const T>),功能完善且经过大量验证。不过如果项目限制不能用第三方库,这个选项就不适用。

总的来说,因为你受限于C++17,标准库确实没有提供这种现成类型,自行实现是最直接、无依赖的方案,代码量小且完全可控。

内容的提问来源于stack exchange,提问作者SMMB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:13:21