私があなたの質問を正しく理解しているなら、あなたが実際に望んでいるのはファンクター(より具体的にはバイナリ述語)を作ることだとnode_comparison
思います:
struct node_comparison
{
bool operator () ( const Node* a, const Node* b ) const
{
return a->totalWeight < b->totalWeight;
}
};
ファンクターは、オブジェクトが呼び出し演算子(operator ()
)のオーバーロードを提供するクラスであるため、関数の呼び出しに使用するのと同じ構文で呼び出すことができます。
Node* p1 = ...;
Node* p2 = ...;
node_comparison comp;
bool res = comp(p1, p2) // <== Invokes your overload of operator ()
内部的std::priority_queue
には、上記のコードスニペットで行ったように、述語を多かれ少なかれインスタンス化し、その方法で呼び出して、要素間の比較を実行します。
通常の関数に対するファンクターの利点は、状態情報を保持できることです(現時点ではおそらく必要ないものですが、多くの場合、望ましいことがわかります)。
#include <cmath>
struct my_comparator
{
my_comparator(int x) : _x(x) { }
bool operator () (int n, int m) const
{
return abs(n - _x) < abs(m - _x);
}
int _x;
};
たとえば、上記の述語は、構築時に提供された別の整数からの距離に基づいて整数を比較します。これはそれがどのように使われることができるかです:
#include <queue>
#include <iostream>
void foo(int pivot)
{
my_comparator mc(pivot);
std::priority_queue<int, std::deque<int>, my_comparator> pq(mc);
pq.push(9);
pq.push(2);
pq.push(17);
while (!pq.empty())
{
std::cout << pq.top();
pq.pop();
}
}
int main()
{
foo(7);
std::cout << std::endl;
foo(10);
}