Проблема в том, что оператор функции-члена () не является виртуальным. Поэтому мне нужно знать, какой тип объекта был задан, чтобы выполнить динамическое приведение, что не очень приятно.
Почему вы хотите выполнить динамическое приведение? Обычно вам это не нужно. Просто вызовите operator()
функтора так же, как вы вызываете обычную функцию.
Смысл функтора в том, что они ведут себя как обычные функции, и вы передаете параметр шаблона в свой алгоритм (не так ли?) Для обработки различных типов функторов (и функций).
Конечно, все это основано на том факте, что вы фактически передаете параметр шаблона в свою функцию. std::binary_function
не подходит в качестве виртуального базового класса. Он просто существует для определения нескольких удобных typedef. Таким образом, объявление вашей функции должно выглядеть так:
template <typename TBinaryFunction>
void your_algorithm(rest of parameters …, TBinaryFunction f);