在std :: vector上强制执行大小约束的非侵入式方法?

hel*_*loB 14 c++

我希望有某种std::vector不能超过const int MAX_LENGTH元素的东西.我理解我无法覆盖std::vector非虚函数,我需要做的是对所有相关的成员函数进行大小检查(例如assign,push_back......有这么多).最明显的方法是std::vector用一个class确保不会超出最大长度的操作.但这似乎很笨拙.有没有比封装类更优雅的解决方案来限制std :: vector的大小?

Rei*_*ica 13

你确定矢量本身不能增长,或者只是这种矢量的消费者需要限制参数的大小吗?如果是后者,那么只assert(arg.size() <= MAX_LENGTH)需要在需要的地方,记录并完成.否则,请继续阅读.

A std::vector可以有无限大小.如果你限制这个尺寸,那就不再是std::vector了.因此,std::vector在不违反Liskov替代原则的情况下,您无法公开获得并限制大小.派生类仍然是一个向量,但不作为一个向量,并且不能用作一个,这样的接口将彻底混淆您的用户,并且编译器将不会捕获随之而来的严重使用错误.这是个坏主意.

您可以做的最好的事情是私有地从向量派生,或者有一个向量作为成员,并在强制执行大小时公开所有向量的接口.这样的矢量不能转换为std::vector,虽然显然你可以允许它被复制或移动到std::vector.它仍然会像矢量那样执行,仍然允许通过迭代器等进行访问.

我们谈的是一个非常小的类,它的实现只需遵循标准(或至少是cpp引用),你将所有真正的工作留给私有std::vector.所以这并不笨重,这是唯一理智的做法.