38項 値渡し用のファンクタクラスを設計しよう

値渡し用のファンクタクラスを設計しよう



STLの関数オブジェクトは関数ポインタをモデルとしているため、関数オブジェクトを値渡しします。
例えば、for_eachは下のように宣言されています。

template<class InputIterator,
         class Function>
Function for_each(InputIterator first,
                  InputIterator last,
                  Function f)

関数オブジェクトは値渡しされるため、サイズを小さくし、仮想関数を使わないようにする必要があります。
大きなサイズの関数オブジェクトを作るときや、仮想関数を含むときは、Effective C++ 34項のように実装と呼び出しを分けるようにします。