Как я могу передать вызываемый объект в функцию в качестве параметра

В стандартной библиотеке c ++ почти вся функция algo принимает вызываемый объект в качестве аргумента. Теперь я хочу попробовать это с моей программой. Я открыл заголовки для функции, как find_if или же search_n() но не мог многое понять о том, как обрабатываются эти параметры вызываемого объекта и, конечно же, как передается аргумент, особенно для лямбда-объекта (может bind() быть использованным для лямбд, я не знаю)


Может кто-нибудь объяснить мне, как эта вещь работает. заранее спасибо

3

Решение

Просто укажите параметр шаблона для функционально-подобного типа и получите аргумент этого типа:

template <typename Function>
void foo(Function func) {
// Use func like so
func(10);
}

Вот как это делают стандартные библиотечные алгоритмы. Вы могли бы назвать это с лямбдой так:

foo([](int x) { std::cout << (x * 2) << std::endl; });

Конечно, это требует, чтобы вы указали в своей документации, какую функцию вы ожидаете в качестве Function типа (пока мы не получим (пока мы не получим Концепции). Должно ли это быть одинарным? Binary? Какие аргументы типа он должен принимать? Что он должен вернуть?

Кроме того, вы можете взять функцию определенного типа с помощью std::function:

int foo(std::function<int(char)> func) {
return func('a');
}

Этот раз, foo будет принимать только функциональные объекты, которые принимают char аргумент и вернуть int, Однако у этого метода есть один недостаток, заключающийся в том, что компилятор вряд ли встроит любые лямбды, которые вы передаете как func,

Самый простой способ получить функцию в качестве аргумента — использовать указатель на функцию:

int foo(int (*func)(char)) {
return func('a');
}

Тем не менее, это будет только взять указатели на функции (некоторые лямбды могут быть преобразованы в указатели на функции). Это не займет функторов или что-нибудь еще в этом роде.

11

Другие решения

Все функции алгоритма должны иметь некоторые функции для проверки алгоритма, например find_if должен знать, какой предикат вы хотите проверить в цикле. Вся библиотека std работает с шаблоном, и вы можете пройти функциональный тест как вызываемый объект. Вызываемый объект — это объект, у которого есть оператор перегрузки (), при этом std lib вызовет ваш отправленный объект с некоторым параметром и при необходимости вернет возвращаемое значение. Вы можете найти, какие параметры и возвращаемые значения необходимы на каком-то сайте, особенно я всегда использую http://www.cplusplus.com/ Вы можете найти много документации по всем стандартным библиотекам в справочном меню.

Специальный пример от вас:
http://www.cplusplus.com/reference/algorithm/find_if/
find_if будет принимать 2 итератора, один как первый, а другой как последний, и вызываемый объект, который возьмет объект, указанный вашим итератором, и вернет логическое значение.

0

По вопросам рекламы [email protected]