Функциональные объекты и функторы часто описываются в терминах концепции. Это означает, что они описывают набор требований типа. Многое в отношении функторов изменилось в C++11, и новая концепция называется Callable
. Объект o
вызываемого типа — это объект, в котором (по существу) выражение o(ARGS)
истинно. Примеры для Callable
:
int f() {return 23;}
struct FO {
int operator()() const {return 23;}
};
Часто также добавляются некоторые требования к возвращаемому типу Callable
. Вы используете Callable
следующим образом:
template<typename Callable>
int call(Callable c) {
return c();
}
call(&f);
call(FO());
Конструкции, подобные приведенным выше, требуют, чтобы вы знали точный тип во время компиляции. Это не всегда возможно, и здесь на помощь приходит std::function
.
std::function
- это такой же Callable
, но он позволяет вам стереть фактический тип, который вы вызываете (например, ваша функция, принимающая вызываемый объект, больше не является шаблоном). Тем не менее, вызов функции требует, чтобы вы знали ее аргументы и тип возвращаемого значения, поэтому они должны быть указаны как аргументы шаблона для std::function
.
Вы бы использовали это так:
int call(std::function<int()> c) {
return c();
}
call(&f);
call(FO());
Вы должны помнить, что использование std::function
может повлиять на производительность, и вы должны использовать его только тогда, когда уверены, что вам это нужно. Почти во всех других случаях шаблон решает вашу проблему.
person
pmr
schedule
10.10.2012