C ++,前向声明和递归数据类型

时间:2013-06-25 18:44:48

标签: c++ templates stl

我希望能够有一个地图,其中值是指向地图的指针。像

这样的东西
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/1208331http://qscribble.blogspot.fr/2008/06/circular-template-references-in-c.html,但我不确定它们是否以及如何应用于我的案例。

他们使用自己的类(Vertex和Edge; A和B),但是这里std :: map和std :: map :: value_type已经在STL头文件中定义了,我不能只用它来实例化它们组合课。

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

2 个答案:

答案 0 :(得分:1)

将其包裹在一个结构中。您需要为该类型指定一个名称,以便能够引用它。

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所说的那样,你似乎在建模一个有向图,每个节点最多有一个出边。如果你想用图表做一些事情,那里有图表库 - 如果你正在做其他事情,或者如果你只是想学习,那那就是另一个故事。

答案 1 :(得分:0)

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

  

Map是一个Pair关联容器,意味着它的值类型为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));
}