[boost] [iterator] could non-small predicates/functors be stored as boost::optional<T> to avoid double construction?