首页 文章

我怎样才能使用与类外相关的模板化typedef(例如,通过另一个类),与boost :: graph相关

提问于
浏览
1

我找到了一个非常有用的答案,如何在Modifying vertex properties in a Boost::Graph下使用boost :: graph创建模板化图形

对我来说,只要我在Graph-class本身中对图形进行所有工作,这就非常方便 .

但是,可能需要从外部访问信息,例如,一个人可能想要实现一个Printer-class,它接受一个Graph-object并打印出所有存储的信息 .

在这种情况下,访问所有顶点(例如通过顶点迭代器)可能很方便 . 遗憾的是,这不起作用,因为所有typedef都是在Graph-class中完成的,并且这些信息无法从外部访问,因此Printer-class不知道顶点迭代器等是什么 .

我怎么能解决这个问题,仍然保持模板化的方面?

谢谢 .

3 回答

  • 0

    但是typedef是公共的,所以你可以从外面访问它们:

    template<typename T>
    class A
    {
    public:
        typedef T type;
        typedef unsigned data;
    };
    

    现在这是以下内容:

    A<int>::type // int
    A<int>::data // unsigned
    

    如果未指定T,请注意

    template<typename T>
    void func( A<T>& a )
    {
        typename A<T>::type // T
        typename A<T>::data // unsigned
    }
    
  • 0

    不幸的是,这不起作用,因为所有typedef都是在Graph-class中完成的,并且无法从外部访问此信息

    我不太关注...... typedef 都是公开的,因此它们可以从外面很方便地访问 . 访问依赖名称时,请注意使用 typename

    typename Graph<TProp, TEdge>::vertex_iterator i;
    
  • 0

    你的问题对我来说有点混乱,但我想你正在寻找这样的事情:

    // console was chosen just to make the example simple, but 
    // it can be more generic easily
    template <typename vertex_t>
    class ConsolePrinter {
    public:
        template <typename iter_t>
        void print(iter_t vbegin, iter_t vend) const {
           copy(vbegin, vend, std::ostream_iterator<vertex_t>(std::cout, "\r\n"));
        }
    };
    

    然后,按照您链接的示例,您将得到以下内容:

    typedef Graph<VertexProperties, EdgeProperties> MyGraph;
    MyGraph g;
    MyGraph::vertex_range_t vertices_range = g.getVertices(); 
    ConsolePrinter<MyGraph::Vertex> printer;   
    printer.print(vertices_range.first,vertices_range.second);
    

    正如Konrad和其他人已经在这个帖子中所说的那样,你从该类中获取迭代器和其他typedef没有问题,你可以保持你的解决方案非常通用 . 顺便说一句,您选择的打印解决方案会产生一些期望(在我的情况下,顶点类型必须能够与 ostreamoperator<< 一起使用),但是这可以在不损失解决方案的通用方面的情况下进行处理 .

相关问题