ネット上で関数オブジェクト (呼び出し先) に関する例をいくつか見つけましたが、コールバック関数 (呼び出し元) の引数としてそれらを使用する方法を示していませんでした。したがって、私は自分で作成しました:
class CBase
{
public:
virtual int operator()(int a, int b)
{
return 10;
}
};
class CSmaller: public CBase
{
public:
int operator()(int a, int b)
{
return a < b;
}
int Compute(int a, int b)
{
return a < b;
}
};
class CLarger: public CBase
{
public:
int operator()(int a, int b)
{
return a > b;
}
int Compute(int a, int b)
{
return a > b;
}
};
int caller(CBase &f, int x0, int x1)
{
return f(x0,x1);
}
int main()
{
CLarger callee1; /*this callee is being called by caller*/
CSmaller callee2; /*idem*/
int q=caller(callee1,0,1);
int z=caller(callee2,0,1);
printf("%d\n",q);
printf("%d\n",z);
}
これらの STL 関数オブジェクト (より大きな Less など) は、このように実装されていますか? つまり、それら (CLarger と CSmaller) は、クラスごとに拡張された仮想関数を持つリレーション/共通アンカーを持っていますか、それともいくつかの一般的な関数オブジェクトにすることもできますか (2 つの引数を持つ () 演算子を実装する限り) ? このように(ただしテストされていません):
template<class F>
float integrate(const F &f,float x0,float x1)
{
..f(x)..;
}
float derive(const F &f,float x0,float x1)
{
..f(x)..;
}
class CSquare
{
public:
float operator()(float x)
{
return x*x;
}
};
class CTwoX
{
public:
float operator()(float x)
{
return 2*x;
}
};
これが正しい方法である場合、これらの無関係なクラスを非 STL の方法で実装するにはどうすればよいでしょうか? テンプレートを使用して基になるメカニズムを保持することは知っていますが (そのように関連している)、タイプのみが異なります。しかし、そのような関係 (つまり、同じアンカー) は必要なのでしょうか?
関数オブジェクトでオーバーロードされた () を使用しているのは、利便性のためだけですか? CLarger の Compute も使えるからです。たとえば、Larger と Smaller のメンバーを持つクラス CCompute で、これらの分離されたクラス (さまざまな機能に virtual を使用) をマージすることもできます。ところで、派生と統合をクラスに入れることもできると思います。私の質問は理にかなっていますか、それとも私の考えはSTL理論と矛盾していますか?