你如何限制`resize()`在构建向量后被调用?

How do you restrict `resize()` from being called after constructing a vector?

我正在构建一个 class,它公开一个固定长度的顺序容器,但编译时不知道长度。

所以当构造我的class实例时,传入一个参数,表示需要多大的vector。

但施工后需要固定长度
我需要保证无法调用 resize() 函数,同时仍然允许我的代码的其他部分修改向量中的各个元素。
(换句话说,我不能简单地将向量公开为 vector<T> const&

其他任何修改长度的函数也是如此,例如insert()push_back()
这些功能需要限制或隐藏。

这可能吗?
或者我真的需要构建自己的 fixed_vector 包装器 class 来隐藏不需要的功能吗?

从 C++20 开始,您可以 return 一个 std::span 到向量中的范围。这允许访问元素的大小和可修改的访问,但不允许 vector 的修饰符。

例如:

#include<vector>
#include<span>

class A {
    std::vector<int> vec;
public:
    /*...*/
    auto getVec() {
        return std::span(vec);
    }
 };

return值可以作为范围,但是无法访问容器接口

根据所需的类型和初始化,如果您知道大小不会改变,您也可以使用数组 std::unique_ptr 而不是 std::vector。但是,这不会存储尺寸,您需要自己存储尺寸:

#include<vector>
#include<span>

class A {
    std::size_t vec_size;
    std::unique_ptr<int[]> vec;
public:
    A(std::size_t size) : vec_size(size), vec(std::make_unique<int[]>(size)) { }

    auto getVec() {
        return std::span(vec, vec_size);
    }
 };

这可能稍微更 space 有效,因为它不需要考虑向量大小和容量的差异。