関数呼び出し間で状態を維持するためではなく、関数呼び出し間で共有されるいくつかの引数を取得したいため、ファンクターを作成する傾向があります。例として:
class SuperComplexAlgorithm
{
public:
SuperComplexAlgorithm( unsigned int x, unsigned int y, unsigned int z )
: x_( x ), y_( y ), z_( z )
{}
unsigned int operator()( unsigned int arg ) const /* yes, const! */
{
return x_ * arg * arg + y_ * arg + z_;
}
private:
// Lots of parameters are stored as member variables.
unsigned int x_, y_, z_;
};
// At the call site:
SuperComplexAlgorithm a( 3, 4, 5 );
for( unsigned int i = 0; i < 100; ++i )
do_stuff_with( a ); // or whatever
に比べ
unsigned int superComplexAlgorithm( unsigned int x, unsigned int y,
unsigned int z, unsigned int arg )
{
return x * arg * arg + y * arg + z;
}
// At the call site:
auto a = std::bind( superComplexAlgorithm, 3, 4, 5, std::placeholders::_1 );
for( unsigned int i = 0; i < 100; ++i )
do_stuff_with( a );
私の意見では、最初の解決策には多くの欠点があります。
x
,y
,が行うことのドキュメントはz
、別の場所 (コンストラクター、クラス定義、operator()
) に分かれています。- 定型コードがたくさん。
- 柔軟性が低い。パラメータの別のサブセットをキャプチャしたい場合はどうすればよいですか?
boost::bind
はい、私は、またはがどれほど有用であるかを理解しstd::bind
ました。多くのコードでこれを使い始める前の質問ですが、単純な関数で引数をバインドするよりも、手書きのステートレス ファンクターを使用することを検討すべき状況はありますか?