私はC++テンプレートを使用して、関数ファンクタを渡して関数の動作を変更しています。それはうまく動作します。私が渡すファンクタは、ストレージのないステートレスクラスであり、古典ファンクタの方法で()演算子をオーバーロードします。Functorクラスがコンストラクタで作業をしています
template <typename Operation> int foo(int a)
{
int b=Operation()(a);
/* use b here, etc */
}
これは頻繁に実行され、うまく動作し、よくテンプレート化された6人または7人のテンプレートが作成されています。
しかし、私はコードの優雅さと効率についても心配しています。ファンクタはステートレスなので、Operation()コンストラクタはフリーであり、ファンクタの評価はインライン関数と同じくらい効率的ですが、すべてのC++プログラマのように、私はいつも疑問を持っています。
もう1つの質問は、代替ファンクタアプローチを使用できるかどうかです。()演算子をオーバーライドしませんが、コンストラクタ内のすべてを副作用として実行します。 何かのように:
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 */
}
私は、誰もがファンクタの「作品」としてコンストラクタを使用し見たことがないが、それが動作するはずのように思えます。利点はありますか?不利な点はありますか?私は奇妙な二重のかっこ "演算子()(a)"の除去が好きですが、それはまさに美的かもしれません。
誰が投げられないのですか? –
@Mykola Golubyev:Dtors - 少なくとも、あなたは投げるべきではありません。 – dirkgently