Наткнулся тут на вопрос про std::bind и возник вопрос.
Чем отличается способ с шаблоном
template
от
void display( int a[], size_t n, std::function
и от
void display( int a[], size_t n, int operation( int ) )
{
}
Какие возможности и ограничения у того или иного способа, когда их нужно применять.
Ответ
Первый вариант принимает любой объект, не проверяя его тип. Так, если туда передать что-то, что не может быть вызвано, или что-то, что возвращает тип, который не может быть использован в cout, то получите не совсем релевантную ошибку компиляции.
Второй вариант принимает любой объект, который может быть вызван. При это согласованность сигнатур проверяется сразу и выдаётся релевантная ошибка, что позволяет быстрее понять, где проблема.
Третий вариант принимает лишь свободные функции и лямбды без состояний и является более ограниченным чем второй вариант. Использовать третий вариант в современном C++ коде нет никакого смысла.
Касательно применения: стоит всегда использовать std::function, за исключением тех моментов, когда это по каким-то причинам вредит.
Комментариев нет:
Отправить комментарий