C++、正向声明和递归数据类型

C++, forward declaration and recursive data types

本文关键字:递归 数据类型 声明 C++      更新时间:2023-10-16

我希望能够有一个映射,其中的值是指向映射的指针。类似的东西

std::map<KeyType, const_pointer_to_this_map's_value_type>

我知道我可以使用const void*而不是const_pointer_to_this_map's_value_type。

我看到了循环数据类型定义的技巧,例如https://gist.github.com/tivtag/1208331或http://qscribble.blogspot.fr/2008/06/circular-template-references-in-c.html但我不确定它们是否以及如何适用于我的案件。

在那里,它们使用自己的类(Vertex和Edge;A和B),但在这里,std::map和std::map::value_type已经在STL标头中定义,我不能只用Combo类实例化它们。

有没有办法定义上面的地图?

只需将其包装在一个结构中。你需要给类型一个名称,以便能够引用它。

template<class T>
class Graph {
    std::map<T, const Graph<T>*> data;
public:
    // ...
};

在C++11中,您还可以使用带有前向声明的typedef的模板别名:

namespace {
template<class T>
struct GraphWrap {
    class type;
    typedef std::map<T, const typename GraphWrap<T>::type*> type;
};
}
template<class T>
using Graph = typename GraphWrap<T>::type;

当然,在这里使用std::map可能有点误导,因为您使用的是键类型参数作为容器的值类型。就像Mooing Duck所说的,你似乎在建模一个有向图,其中每个节点最多有一条传出边。如果你想用图做一些事情,有一些图库——如果你在做其他事情,或者你只是想学习,那就另当别论了。

来源http://www.sgi.com/tech/stl/Map.html

Map是一个成对关联容器,这意味着它的值类型是pair<const Key, Data>

std::map<K, M>::value_type总是std::pair<K, M>,所以:

#include <map>
typedef int KeyType;
struct MappedType
{
    const std::pair<const KeyType, MappedType>* p;
};
void g()
{
    std::map<KeyType, MappedType> m;
    m[0].p = 0;
    m[1].p = &(*m.find(0));
}