【问题标题】:C++, forward declaration and recursive data typesC++、前向声明和递归数据类型
【发布时间】:2013-06-25 18:44:48
【问题描述】:

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

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 头文件中定义,我不能只用组合类。

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

【问题讨论】:

  • 我检测到一个 XY 问题。你为什么想要这样的东西?
  • 听起来他正在编写一个有向图,其中每个节点都有一条出边。
  • 如果你想定义图表,使用Boost.Graph
  • 我不能推荐 boost.graph。我在一个项目中使用过它,恕我直言,它比它的价值更丑陋。最终解决了它的局限性,而不是利用它的任何优势。除非您真正创建了一组通用图算法,否则不值得痛苦。

标签: c++ templates stl


【解决方案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 说的那样,您似乎正在建模一个有向图,其中每个节点最多有一个出边。如果你想用图表做点什么,有图表库——如果你在做其他事情,或者如果你只是想学习,那就另当别论了。

【讨论】:

  • 我不确定这就是我想要的。这里map的mapped_type是一个指向整个GraphWrapper的指针。所以地图中的所有元素都将具有相同的值。我想要 typedef std::map::type::value_type *> ty​​pe;
  • 你不能声明一个成员类型(或任何类型的同义词)而不定义它,就像你在第二个 sn-p 中尝试做的那样。
  • @user2521308:哦,你想要T = const T*?这就是我最初阅读您的问题的方式,但我不以为然,因为它是无限类型,这实际上没有任何意义。
  • @LucDanton:谢谢,我不确定。 Clang(苹果的3.2版本)可能有bug,貌似可以接受,但我可能只是粗心。
【解决方案2】:

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

Map是一个Pair Associative Container,也就是说它的值类型是pair&lt;const Key, Data&gt;

std::map&lt;K, M&gt;::value_type 总是std::pair&lt;K, M&gt;,所以:

#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));
}

【讨论】:

    猜你喜欢
    • 2017-06-18
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多