C ++相互模板依赖?

时间:2012-03-08 07:57:19

标签: c++ templates design-patterns mutual-recursion

我希望有两个指向彼此的结构。具体来说,我想拥有以下内容:

template<typename Key, typename Value> 
class MyStructure {
public:
  typedef map<Key, list<pair<Value, typename ListType::iterator>>> MapType;
  typedef list<typename MapType::element_type::iterator> ListType;
private:
  MapType map_;
  ListType list_;
}

显然这不起作用,因为ListType以前没有被声明为类型。我怎么能这样做?正如您所看到的,我使用迭代器类型作为指向这两个结构元素的指针。

我正在考虑使用奇怪的重复出现的模板模式,但无法随意使用。有人在## c ++上建议使用模板别名,但也失败了(至少,我不知道如何使用这个想法)。

从概念上讲,我做错了吗?或许“不符合C ++概念”?我当然可以用void * s来做这件事,但我正在尝试用正确的方法做事:)

谢谢!

2 个答案:

答案 0 :(得分:3)

虽然我怀疑这可能是重复的(并且在很多方面都是如此),“干杯和hth。 - Alf”是正确的指出潜在的重复问题是关于使用typedef的具体问题。这种事。

然而,在目前的问题中,OP想知道如何在问题中描述的情景中处理相互包容。

这是一个建议:

#include <list>
#include <map>

template <typename Key, typename Value>
class MyElement;

template <typename Key, typename Value>
class MyStructure
{
public:
  typedef std::map<Key,MyElement<Key,Value> > MapType;
  typedef std::list<MyElement<Key,Value> >    ListType;
};

template <typename Key, typename Value>
class MyElement {
public:
  typename MyStructure<Key,Value>::MapType::iterator  map_iterator;
  typename MyStructure<Key,Value>::ListType::iterator list_iterator;
};

如您所见,我引入了一种新的数据类型MyElement,其中包含列表迭代器以及映射迭代器。因为这是一个类而不是一个typedef,所以它可以是前向声明的。

答案 1 :(得分:0)

遗憾的是,这是不可能的,就像你表达它一样。

另一方面,在我看来(根据您的要求)您可以撤销存储。

如果您使用list的{​​{1}},然后将地图指向此列表,该怎么办?

这会打破循环依赖。

Values

(不确定我是否真的明白你想要实现的目标......)

您应该考虑的另一个解决方案是看看您是否可以用Boost.MultiIndex来表达这一点。当需要多个迭代/查找模式时,Boost.MultiIndex通常是比手工解决方案更好的替代方案,因为它在值内交错索引以便最小化存储。加上一致性(即,所有索引都引用相同的元素集)是给定的。