#include <iostream>
#include <vector>
#include <string>
#include <functional>
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 Comparator>
class PQueue {
protected:
Comparator compareFunction;
public:
PQueue (Comparator compareFunctionParameter) : compareFunction(compareFunctionParameter) {
}
int someMethod() {
// call the function
node n1, n2;
n1.val1 = "node1_val1";
n1.val2 = "zzz";
n2.val1 = "node2_val1";
n2.val2 = "aaa";
return compareFunction(n1, n2);
}
};
int main() {
// queue with pointer to function
PQueue<node, int (*)(node, node)> pq(compareNode);
cout << pq.someMethod() << endl;
// queue with lamda (anonimous function)
PQueue<node, std::function<int (node, node)>> pq_lambda([](node a, node b) -> int {return a.val1.compare(b.val1);} );
cout << pq_lambda.someMethod() << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBub2RlewogICBzdHJpbmcgdmFsMTsKICAgc3RyaW5nIHZhbDI7CiAgIHZlY3Rvcjxub2RlICo+IGNvbm5lY3RlZE5vZGVzOwp9OwoKaW50IGNvbXBhcmVOb2RlKG5vZGUgYSxub2RlIGIpewogLy9kZXNjcmliZSB0aGUgY29tcGFyZQogcmV0dXJuIGEudmFsMi5jb21wYXJlKGIudmFsMik7IC8vIG9yIGFueSBvdGhlciBjb2RlCn0KCnRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBDb21wYXJhdG9yPgpjbGFzcyBQUXVldWUgewogIHByb3RlY3RlZDoKICAgIENvbXBhcmF0b3IgY29tcGFyZUZ1bmN0aW9uOwogICAgCiAgcHVibGljOgoKICAgIFBRdWV1ZSAoQ29tcGFyYXRvciBjb21wYXJlRnVuY3Rpb25QYXJhbWV0ZXIpIDogY29tcGFyZUZ1bmN0aW9uKGNvbXBhcmVGdW5jdGlvblBhcmFtZXRlcikgewogICAgfQoKICBpbnQgc29tZU1ldGhvZCgpIHsKICAgICAvLyBjYWxsIHRoZSBmdW5jdGlvbgogICAgIG5vZGUgbjEsIG4yOwogICAgIG4xLnZhbDEgPSAibm9kZTFfdmFsMSI7CiAgICAgbjEudmFsMiA9ICJ6enoiOwogICAgIAogICAgIG4yLnZhbDEgPSAibm9kZTJfdmFsMSI7CiAgICAgbjIudmFsMiA9ICJhYWEiOwogICAgIHJldHVybiBjb21wYXJlRnVuY3Rpb24objEsIG4yKTsKICB9Cn07CgppbnQgbWFpbigpIHsKCS8vIHF1ZXVlIHdpdGggcG9pbnRlciB0byBmdW5jdGlvbgoJUFF1ZXVlPG5vZGUsIGludCAoKikobm9kZSwgbm9kZSk+IHBxKGNvbXBhcmVOb2RlKTsKCWNvdXQgPDwJcHEuc29tZU1ldGhvZCgpIDw8IGVuZGw7CgkKCS8vIHF1ZXVlIHdpdGggbGFtZGEgKGFub25pbW91cyBmdW5jdGlvbikKCVBRdWV1ZTxub2RlLCBzdGQ6OmZ1bmN0aW9uPGludCAobm9kZSwgbm9kZSk+PiBwcV9sYW1iZGEoW10obm9kZSBhLCBub2RlIGIpIC0+IGludCB7cmV0dXJuIGEudmFsMS5jb21wYXJlKGIudmFsMSk7fSApOwoJY291dCA8PAlwcV9sYW1iZGEuc29tZU1ldGhvZCgpIDw8IGVuZGw7CglyZXR1cm4gMDsKfQo=