继续上一个问题HERE,是否可以在现有的过滤图上定义/初始化filtered_graph。例如,
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
当我尝试在现有的过滤图上创建新过滤器时,我遇到了编译器错误....但是,我可以在原始图上定义一个新的过滤器..
另外我如何调用谓词 - &gt; FG 上的filter3作为构造函数参数(通过引用)获得
答案 0 :(得分:1)
是的,完全可以在过滤后的图表上使用过滤图表。它应该具有与在原始图表上组合过滤器相同的效率。
请记住,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);
AFAIK,没有记录的方法来访问用于形成过滤图的“原始”谓词。未记载的方法是使用Boost代码的内部结构如下:
FilteredGraphType_t fg = ...
EPred edgeFilter = fg.m_edge_pred;
FilteredGraphType_t :: edge_descriptor ed = ... bool edge_ok = edgeFilter(ed); //与edgeFilter.operator()(ed)相同;
似乎推荐的方法是将您的filter3
谓词作为A类成员。