Страницы

Поиск по вопросам

понедельник, 14 января 2019 г.

Способы передачи функции(функтора) в качестве аргумента другой функции

Наткнулся тут на вопрос про std::bind и возник вопрос.
Чем отличается способ с шаблоном
template void display( int a[], size_t n, Operation op ) // или Operation&& { for ( size_t i = 0; i < n; i++ ) { std::cout << op( a[i] ) << ' '; } std::cout << std::endl; }
от
void display( int a[], size_t n, std::function operation ) { //... }
и от
void display( int a[], size_t n, int operation( int ) ) {
}
Какие возможности и ограничения у того или иного способа, когда их нужно применять.


Ответ

Первый вариант принимает любой объект, не проверяя его тип. Так, если туда передать что-то, что не может быть вызвано, или что-то, что возвращает тип, который не может быть использован в cout, то получите не совсем релевантную ошибку компиляции.
Второй вариант принимает любой объект, который может быть вызван. При это согласованность сигнатур проверяется сразу и выдаётся релевантная ошибка, что позволяет быстрее понять, где проблема.
Третий вариант принимает лишь свободные функции и лямбды без состояний и является более ограниченным чем второй вариант. Использовать третий вариант в современном C++ коде нет никакого смысла.
Касательно применения: стоит всегда использовать std::function, за исключением тех моментов, когда это по каким-то причинам вредит.

Комментариев нет:

Отправить комментарий