#include <iostream>
#include <vector>
#include <string>
using namespace std;
struct node{
string val1;
string val2;
vector< node * > connectedNodes;
} ;
int compareNode( node a,node b) {
//describe the compare
return a.val2 .compare ( b.val2 ) ; // or any other code
}
template < class T>
class PQueue {
protected :
// this declares a private member named compareFunction of type pointer to a function which takes 2 T parameters and returns a int. Note that all the parenthesis are mandatory
int ( * compareFunction) ( T, T) ;
public :
PQueue ( int ( * compareFunctionParameter) ( T, T) ) : compareFunction( compareFunctionParameter) {
// this constructor receives a pointer to function and initializes it's member to that pointer. If the constructor initialization list confuses you, you can read 'compareFunction = compareFunctionParameter '
}
int someMethod( ) {
// call the function through the pointer you have:
node n1, n2;
n1.val1 = "node1_val1" ;
n1.val2 = "zzz" ;
n2.val1 = "node2_val1" ;
n2.val2 = "aaa" ;
return compareFunction( n1, n2) ;
}
} ;
int main( ) {
PQueue< node> pq( compareNode) ;
cout << pq.someMethod ( ) << endl;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IG5vZGV7CiAgIHN0cmluZyB2YWwxOwogICBzdHJpbmcgdmFsMjsKICAgdmVjdG9yPG5vZGUgKj4gY29ubmVjdGVkTm9kZXM7Cn07CgppbnQgY29tcGFyZU5vZGUobm9kZSBhLG5vZGUgYil7CiAvL2Rlc2NyaWJlIHRoZSBjb21wYXJlCiByZXR1cm4gYS52YWwyLmNvbXBhcmUoYi52YWwyKTsgLy8gb3IgYW55IG90aGVyIGNvZGUKfQoKdGVtcGxhdGUgPGNsYXNzIFQ+CmNsYXNzIFBRdWV1ZSB7CiAgcHJvdGVjdGVkOgogICAgLy8gdGhpcyBkZWNsYXJlcyBhIHByaXZhdGUgbWVtYmVyIG5hbWVkIGNvbXBhcmVGdW5jdGlvbiBvZiB0eXBlIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB3aGljaCB0YWtlcyAyIFQgcGFyYW1ldGVycyBhbmQgcmV0dXJucyBhIGludC4gTm90ZSB0aGF0IGFsbCB0aGUgcGFyZW50aGVzaXMgYXJlIG1hbmRhdG9yeQogICAgaW50ICgqY29tcGFyZUZ1bmN0aW9uKShULCBUKTsKICAgIAogIHB1YmxpYzoKCiAgICBQUXVldWUgKGludCAoKmNvbXBhcmVGdW5jdGlvblBhcmFtZXRlcikoVCwgVCkpIDogY29tcGFyZUZ1bmN0aW9uKGNvbXBhcmVGdW5jdGlvblBhcmFtZXRlcikgewogICAgICAgLy8gdGhpcyBjb25zdHJ1Y3RvciByZWNlaXZlcyBhIHBvaW50ZXIgdG8gZnVuY3Rpb24gYW5kIGluaXRpYWxpemVzIGl0J3MgbWVtYmVyIHRvIHRoYXQgcG9pbnRlci4gSWYgdGhlIGNvbnN0cnVjdG9yIGluaXRpYWxpemF0aW9uIGxpc3QgY29uZnVzZXMgeW91LCB5b3UgY2FuIHJlYWQgJ2NvbXBhcmVGdW5jdGlvbiA9IGNvbXBhcmVGdW5jdGlvblBhcmFtZXRlciAnCiAgICB9CgogIGludCBzb21lTWV0aG9kKCkgewogICAgIC8vIGNhbGwgdGhlIGZ1bmN0aW9uIHRocm91Z2ggdGhlIHBvaW50ZXIgeW91IGhhdmU6CiAgICAgbm9kZSBuMSwgbjI7CiAgICAgbjEudmFsMSA9ICJub2RlMV92YWwxIjsKICAgICBuMS52YWwyID0gInp6eiI7CiAgICAgCiAgICAgbjIudmFsMSA9ICJub2RlMl92YWwxIjsKICAgICBuMi52YWwyID0gImFhYSI7CiAgICAgcmV0dXJuIGNvbXBhcmVGdW5jdGlvbihuMSwgbjIpOwogIH0KfTsKCmludCBtYWluKCkgewoJUFF1ZXVlPG5vZGU+IHBxKGNvbXBhcmVOb2RlKTsKCWNvdXQgPDwJcHEuc29tZU1ldGhvZCgpIDw8IGVuZGw7CglyZXR1cm4gMDsKfQo=