C++相互模板依赖?
-
09-12-2019 - |
题
我想有两个互相指向的结构。具体来说,我希望有以下内容:
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做到这一点,但我试图让事情以正确的方式:)
谢谢!
解决方案
虽然我怀疑这可能是一个重复的(并且在许多方面它是),"干杯和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,所以它可以向前声明。
其他提示
不幸的是,这是不可能的,在你表达它的方式。
另一方面,在我看来,(鉴于您的要求)您可以反转存储。
如果你用了一个 list
的 Values
, ,然后让地图指向这个列表?
这将打破循环依赖。
typedef std::list< std::pair<Key, Value> > ListType;
typedef std::multiset<typename ListType::iterator, CmpFirst> MapType;
(不知道我是否真的明白你试图实现的目标。..)
你可能应该考虑的另一个解决方案是看看你是否可以用 升压。多索引.当需要多次迭代/查找模式时,Boost。MultiIndex通常是比手工解决方案更好的替代方案,因为它在值内交错索引,以便最大限度地减少存储。加一致性(即,具有引用相同元素集的所有索引)是给定的。
不隶属于 StackOverflow