- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我刚刚发现了一些对我来说很奇怪的东西。考虑:
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 在正确的轨道上 - 你肯定需要一个 Tile
和 ConstTile
类,为了简单起见,它们可以被模板化,但是你需要处理什么时候可以调用 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 ↦
};
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/
我不明白为什么我的 Java 代码没有出现错误。我有一个使用泛型类型的类: import java.util.*; // For ArrayList public class Hat { pub
我正在 Pygame 中开发一款射击类游戏供我自己娱乐,在创建玩家的基本 Action 的过程中我遇到了一些疑问,“Dash”和“Switch”均未按预期工作。 ... def switch(self
当我加载一个显示的网页时,为什么我要为每个图像的 HTTP 请求打开一个新的 TCP 连接?为什么在页面加载期间不重复使用单个 TCP 连接? 最佳答案 我认为浏览器通常会打开多个连接,以便它可以并行
我一直在谷歌搜索,只能找到 a trivial example Compute Capability 3.0 中的新动态并行性在其链接的其中一份技术简报中介绍 from here .我知道 HPC 专
我使用 Telerik 和 Microsoft CDN,分别用于它们各自的 AJAX 工具包。两者在 99% 的情况下都工作得很好。然而,我最近在两家不同的咖啡馆工作并访问了我的网站:第一家咖啡馆不允
我在一家从事网络托管的 IT 公司工作,而且我个人对 SQL 非常缺乏经验*。 *看起来很糟糕 我的一个客户正在尝试将 Epos 系统与其 magento 网站集成,在 Epos 集成过程中,他们遇到
我的代码现在有一个循环,它调用蒙特卡洛函数来计算多个样本的简单积分(y=x,从 0 到 1),并将总时间和积分值写入文本文件。然后循环增加线程数并继续前进。现在大约有 8 个线程,时间峰值约为 2.6
所以 HTTP/2 增加了我想要利用的性能。出于各种原因,我不喜欢连接我的 javascript,而 HTTP/2 无论如何都会使它变得不必要。 但是。我正在开发一个将部署在客户本地网络中的网络应用程
我写了一个非常简单的 Haskell 程序: main = print $ sum $ map read ["55", "99", "101"] 鉴于我过去的经验,我预计会得到一个“歧义类型”错误,因
我是一名优秀的程序员,十分优秀!