
On Tue, 30 Nov 2010, Cedric Laczny wrote:
On Tuesday, 30. November 2010 16:57:17 Jeremiah Willcock wrote:
On Mon, 29 Nov 2010, Cedric Laczny wrote:
Hi,
I was wondering if there is a convenient (and to some extent intuitive) way to combine several predicates used in filtering a graph? The idea is to have some predicates defined and arbitrarily combine them so that the filtered_graph will check for compliance of each individual predicate and either make this vertex/edge visible or not. Of course, the predicates should be specific to vertices or edges, respectively, when being combined. When using std::vector or such, they would need to be all of the same type which does not seem very nice/feasible IMHO. Also defining a "big" predicate having a multitude of "smaller" predicates as members is not really an option as this is very restricted. Something like big_predicate = predicate1 || predicate2 || predicate3 (syntax should just illustrate the idea) maybe?
If you don't want to use Boost.Lambda, Boost.Bind also has some operators overloaded (URL:http://www.boost.org/doc/libs/1_45_0/libs/bind/bind.html#operators) to provide the syntax you wanted.
Thanks for the hint. Unfortunately, I'm still hanging at the point where the type of the specified predicate(s) comes into play. Let's look at an example:
struct VPred1{ VPred1() {}; // etc.... template< V > bool operator( const V& v) {return true;} } struct Vpred2{ // s. Vpred1 but operator() returns false }
Vpred1 pred1; Vpred2 pred2; typedef adjacency_list<> Graph; Graph g; // fill graph g filtered_graph< Graph, keep_all, ??? > fg( g, keep_all(), ???);
In the example above I would like to provide both vpred-structs to the filtered_graph like so: filtered_graph< Graph, keep_all, ??? > fg( g, keep_all(), pred1 && pred2);
This is not supposed to work out-of-the-box, it should just demonstrate the idea a bit more into detail.
Concerning the "???" in the template-specification, I have no idea how this should be specifed. All the examples I have found so far, either for phoenix or bind, are direct applications and do not involve the specification of templates. Therefore I have nowhere to start learning how to do this.
Yes, that's the hard part. If you have C++0x (or are willing to use compiler extensions), you can use decltype/auto or typeof to infer the return type of the operator. Another technique (that would make your code messy) is to split the function after the construction of the predicate into a separate function template; that template can then take the predicate as a parameter and its type as a template parameter. You could also try asking the bind developers if the return types of the operators are documented, or if they would fix and document particular types for them. -- Jeremiah Willcock