2014-01-22 1 views
0

с продолжением моего предыдущего вопроса HERE, можно ли определить/инициализировать filter_graph по существуному отфильтрованному графу. например,фильтровать существующий filter_graph в графе BOOST

class A{ 
    FilteredGraphType_t fg // it is a typedef 

    // constructor 
    template < typename ... , typename fil_graph > 
    A (..init parameters.. , fil_graph& FG) // note this. 
    { 

     predicate filter3 (...); // defined predicate 

     // define new filtered_graph here in constructor 
     FilteredGraphType_t newFG (boost::make_filtered_graph(FG, filter3) .. // error 

     write_graphviz(std::cout, newFG); /// error 

    } 
    }; 

Могу ли я сделать что-то вроде этого?

FilteredGraphType fg3(fg3, filter3) ; // call filter and predicate on itself 
    OR 
    FilteredGraphType fg4(fg3, filter3) ; (new filtered graph fg4 filtering over fg3 

Я получаю ошибки компилятора, когда я пытаюсь создать новый фильтр3 над существующими фильтруется граф .... Однако, я могу определить новый фильтр по оригинальной графике ..

Кроме того, как я называю предикат -> фильтр3 на FG, полученный в качестве параметра конструктора (по ссылке)

ответ

1
  1. Да, это вполне возможно использовать фильтрованный график на верхней части фильтрованного графа. Вероятно, он должен иметь такую ​​же эффективность, как объединение фильтров поверх исходного графика.

  2. Помните, что filtered_graph<G,EFG> это другой тип чем тип filtered_graph<F,EFF>. Вероятно, ошибки вашего компилятора происходят из-за того, что вы используете то же самое FilteredGraphType_t в обоих местоположениях вашего кода.

Правильный код может выглядеть следующим образом:

Graph g; 

typedef filtered_graph<G,EPred> FilteredGraphType_t;  
FilteredGraphType_t fg(g, pred); 

typedef filtered_graph<FilteredGraphType,SomePred> DeepFilteredGraphType_t; 
DeepFilteredGraphType_t dfg(fg, somePred); 
  1. AFAIK, не документирован способ получить доступ к «оригинальным» предикатам, используемым для формирования отфильтрованного графа. Незарегистрированный способ заключается в использовании внутренностей коды Boost, следующим образом:

    FilteredGraphType_t фг = ...

    EPred edgeFilter = fg.m_edge_pred;

    FilteredGraphType_t :: edge_descriptor ed = ... bool edge_ok = edgeFilter (ed); // тот же, что и edgeFilter.operator() (ed);

кажется рекомендуемый способ будет иметь свой filter3 предикат в качестве члена вашего класса А.

+0

спасибо! Я получил свою ошибку, я исправлю ее и посмотрю, хорошо ли это работает или нет. – Pogo