gpt4 book ai didi

c++ - 对象的代理,适当的 const 限定和缺乏

转载 作者:太空宇宙 更新时间:2023-11-04 16:12:40 25 4
gpt4 key购买 nike

我刚刚发现了一些对我来说很奇怪的东西。考虑:

struct Tile {

Tile(Map &map, int, int)
: map(map) { }

void destroy();

void display() const;

Map ↦
};

这个(精简的)类是一个访问器对象。它由 Map 本身构建:

Tile Map::operator ()(int x, int y) {
return Tile(*this, x, y);
}

Tile const Map::operator ()(int x, int y) const {
return Tile(*this, x, y);
}

因此 Map 可以返回一个 Tile,我们可以从中调用 destroy()(更新 map ),以及一个 Map const 只能返回一个Tile const,从中我们只能调用非修改的display()方法。

所以一切都很好,对吧?好吧,不完全是。因为尽管起初看起来很简单,但由于 Map& 构造函数参数,我无法弄清楚如何从 Map const 构造 Tile。

我还尝试删除 Tile 的构造函数并对其进行聚合初始化,但无济于事:

Tile const Map::operator ()(int x, int y) const {
return { *this, x, y };
}

...这对我来说更陌生,因为我得到了...

error: invalid initialization of reference of type ‘Map&’ from expression of type ‘const Map’

...即使 Tile const 应该只包含 const 字段,不是吗?

为什么编译器会提示最后一个(第一个很合乎逻辑),我能做些什么来专门为 const 访问重写整个 Tile 类吗?它可能是 const_cast 正确的神话般的地方之一吗?

提前致谢。

最佳答案

Daniel 在正确的轨道上 - 你肯定需要一个 TileConstTile 类,为了简单起见,它们可以被模板化,但是你需要处理什么时候可以调用 destroy() 以及如何构造它们。为此:

template<class MapT>
struct TileT {

TileT(MapT &map, int, int)
: map(map) { }

// we want to be able to construct ConstTile from Tile
template <typename M>
TileT(const TileT<M>& tile)
: map(tile.map) { }

void destroy() {
static_assert(!std::is_const<MapT>::value, "Cannot call destory() from ConstTile");
// rest of implementation
}

void display() const;

MapT &map;
};

using Tile = TileT<Map>;
using ConstTile = TileT<const Map>;

这将为您提供所需的功能,并将以与 iterator/const_iterator 的工作方式类似的方式工作。所以你可以做这样的事情:

Map map;
...
ConstTile tile = map(4,3); // non-const map, ConstTile is ok

关于c++ - 对象的代理,适当的 const 限定和缺乏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26664539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com