【发布时间】:2010-11-12 22:28:44
【问题描述】:
我想声明几个类型
(在K 和V 上模板化的类内部并提供一些缓存行为):
typedef std::map<
long long,
typename key_to_value_type::iterator // Ooops... not declared yet
> timestamp_to_key_type;
typedef std::map<
K,
std::pair<V,typename timestamp_to_key_type::iterator>
> key_to_value_type;
当然这是不可能的,因为循环定义。
我可以用void* 破解它,但我想知道是否有一些前向声明魔法或其他技术可以更好地完成这项工作。
(是的,我知道boost::bimap 会回避这个问题)。
【问题讨论】:
-
您是否尝试使用数据构建地图,然后以不同的顺序对该地图建立索引? (大概是为了快速查找)
-
当我在玩弄一些已经在工作的 LRU 缓存代码时,这个问题出现了(基本上是一个补充了跟踪的键值映射,因此可以在需要时清除最近最少使用的记录)。原始版本的每个映射的值都保存另一个映射的键类型,但是一些 O(log n) 访问可以压缩为使用上面的形式直接迭代器访问。但我不希望这个问题变成关于 LRU 缓存实现的优点的辩论!更重要的是我意识到我不知道如何最好地处理这种 typedef/forward-declaration 问题。
-
+1 这是个好问题。要是我知道你想表达什么类型就好了。
-
有关此问题的更多详细信息,请参阅bottlenose.demon.co.uk/article/lru.htm
标签: c++ stl iterator typedef forward-declaration