Это работает очень хорошо. Но иногда предпочтительнее работать с
functor, чтобы ваши абоненты могли сами выбирать, что лучше для них, и предотвращать небольшие накладные расходы, которые идут с boost::function
:
template<typename Func>
void foo(Func f) {
f(myArgs);
}
Вы также можете добавить перегрузку для конкретного boost::function
, чтобы получить объект по ссылке.
template<>
void foo(const boost::function<void (expectedtypes)>& f) {
f(myArgs);
}
И, возможно, это тоже перегружено для константности.
В случае приема boost::function
объектов различной арности, я бы использовал перегрузку. Если вы идете по этому пути, избегайте шаблонной версии, поскольку у вас возникнут проблемы, как только ваши пользователи попытаются работать с функторами (в отличие от boost::function
с другой арностью). Эта проблема разрешима, но может стать грязной. Вам нужно было бы отправить вызов чему-то, что обнаруживает арентность фьюнтера и выполняет правильный вызов. Но, как вы сказали, шаблоны - это ваше слабое место, это не рекомендуется.