Как передать std-функтор в c ++ и использовать его, не зная, какой именно - PullRequest
1 голос
/ 05 января 2011

У меня есть что-то вроде алгоритма сортировки, и я хочу передать ему функтор, который обеспечивает критерии сортировки (std :: binary_function). Поэтому он должен вызывать T.operator <(), например, если задано std :: less. </p>

Проблема в том, что оператор функции-члена () не является виртуальным. Поэтому мне нужно знать, какой тип объекта был задан, чтобы выполнить динамическое приведение, которое не очень приятно.

С уважением,

Денис

Ответы [ 3 ]

6 голосов
/ 05 января 2011

Проблема в том, что оператор функции-члена () не является виртуальным. Поэтому мне нужно знать, какой тип объекта был задан, чтобы выполнить динамическое приведение, что не очень приятно.

Почему вы хотите выполнить динамическое приведение? Обычно вам это не нужно. Просто вызовите operator() функтора так же, как вы вызываете обычную функцию.

Смысл функтора в том, что они ведут себя как обычные функции, и вы передаете параметр шаблона в свой алгоритм (не так ли?) Для обработки различных типов функторов (и функций).

Конечно, все это основано на том факте, что вы фактически передаете параметр шаблона в свою функцию. std::binary_function не подходит в качестве виртуального базового класса. Он просто существует для определения нескольких удобных typedef. Таким образом, объявление вашей функции должно выглядеть так:

template <typename TBinaryFunction>
void your_algorithm(rest of parameters …, TBinaryFunction f);
1 голос
/ 05 января 2011

Не можете ли вы передать свой функтор в качестве параметра шаблона, чтобы иметь статический полиморфизм ?

0 голосов
/ 05 января 2011

Вы можете использовать Qt Signal и Slots или использовать Boost.Function

...