C++ テンプレートを使用して Strategy ファンクターを渡し、関数の動作を変更しています。それは正常に動作します。私が渡すファンクターは、ストレージを持たないステートレス クラスであり、() 演算子を従来のファンクターの方法でオーバーロードするだけです。
template <typename Operation> int foo(int a)
{
int b=Operation()(a);
/* use b here, etc */
}
私はこれを頻繁に行っており、うまく機能しており、多くの場合、6 つまたは 7 つのテンプレート化されたファンクターを渡してテンプレートを作成しています!
ただし、コードのエレガンスと効率の両方について心配しています。ファンクターはステートレスであるため、Operation() コンストラクターはフリーであり、ファンクターの評価はインライン関数と同じくらい効率的であると想定していますが、すべての C++ プログラマーと同様に、私は常にいくつかのしつこい疑問を抱いています。
私の 2 番目の質問は、別のファンクター アプローチを使用できるかどうかです。() 演算子をオーバーライドせず、コンストラクター内のすべてを副作用として実行する方法です。何かのようなもの:
struct Operation {
Operation(int a, int &b) { b=a*a; }
};
template <typename Operation> int foo(int a)
{
int b;
Operation(a,b);
/* use b here, etc */
}
ファンクターの「作業」としてコンストラクターを使用している人を見たことがありませんが、機能するはずです。何か利点はありますか?デメリットは?私は奇妙な二重括弧 "Operator()(a)" の削除が好きですが、それはおそらく美的です。