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
相关产品推荐
相关产品推荐

