C++ 標準ライブラリ関数は、次のようにファンクター (関数ポインターまたは関数オブジェクト) 引数を値で受け取ります。
template <typename F>
void apply(F func)
{
func();
}
...しかし、 Universal Referenceでファンクターを渡すほうがよいのではないでしょうか? そのようです:
template <typename F>
void apply(F&& func)
{
func();
}
このようにして、状態を維持する関数オブジェクトを渡し、高階関数が戻った後にその (おそらく変更された) 状態にアクセスできます。