38項 値渡し用のファンクタクラスを設計しよう
値渡し用のファンクタクラスを設計しよう
STLの関数オブジェクトは関数ポインタをモデルとしているため、関数オブジェクトを値渡しします。
例えば、for_eachは下のように宣言されています。
template<class InputIterator, class Function> Function for_each(InputIterator first, InputIterator last, Function f)
関数オブジェクトは値渡しされるため、サイズを小さくし、仮想関数を使わないようにする必要があります。
大きなサイズの関数オブジェクトを作るときや、仮想関数を含むときは、Effective C++ 34項のように実装と呼び出しを分けるようにします。