2014-01-22 23 views
0

與繼續我的前一個問題HERE,是否有可能定義/初始化現有過濾圖上的filtered_graph。例如,過濾現有filtered_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 ....不過,我可以定義在原始圖新的過濾器..

而且我怎麼叫謂詞 - >上FG作爲構造參數(由參考)中得到

回答

1
  1. 是,它是完全可以使用過濾後的曲線圖的頂部上的過濾圖形過濾器3。它應該具有與在原始圖形頂部組合濾鏡相同的效率。

  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. 據我所知,有訪問用於形成過濾圖中的「原始」謂詞沒有任何記載的方法。無證的方法是使用升壓代碼的內部,如下所示:

    FilteredGraphType_t FG = ...

    EPred edgeFilter = fg.m_edge_pred;

    FilteredGraphType_t :: edge_descriptor ed = ... bool edge_ok = edgeFilter(ed); //和edgeFilter.operator()(ed)相同;

似乎推薦的方法是讓你的filter3謂語

+0

感謝你的類A的一員!我弄錯了,我會解決它,看看它是否正常工作。 – Pogo