我正在使用一个定义一些数据类型类的库,这些类通常实现为围绕 std::vector<> 的紧密包装器。类型层次结构有好几层深,大多只添加了详细的构造函数。
我的问题:基类将其 std::vector 定义为私有(这很好),但只添加了一个访问器方法作为 const。派生类甚至无法访问它。库看起来像这样(为了清楚起见,简称):
template <class T> class BaseList
{
public:
BaseList (const T data0) : data_ (1) {
data_[0] = data0; }
const T & operator[] (const size_t nr) const {
// does out off bounds check here
return data_[nr]; }
private:
std::vector<T> data_;
}
class FancyClass : public BaseList<SomeEnumType>
{
public:
FancyClass (const SomeOtherEnumType data0)
: BaseList<SomeEnumType> ( static_cast<SomeEnumType> (data))
{}
}
现在我看到了, const 定义完全是假的。没有内部方法依赖于真正恒定的向量,我在外部代码中也没有。
我喜欢做的就是这样:
strukt MyType {
FancyClass myData;
bool otherData;
}
int main() {
MyType storage = {FancyClass(0), false};
storage.myData[0] = 5;
}
由于 const-ness,这当然不起作用。(“分配只读位置”)
责任完全在我这边:我可以做一些 const_cast 魔法来使这个结构可写吗?我知道的唯一另一种可能性是在我的代码中完全复制类型层次结构,但这仍然会给我留下很多强制转换或 toFancyClass() 函数,以便在我接口库代码时调用。
有任何想法吗?谢谢!
(请不要评论库的代码质量。如果我可以改变它,我不会问这个问题......)