std::function
это объект стирания типа. Это означает, что он стирает детали того, как происходят некоторые операции, и предоставляет им единый интерфейс времени выполнения. За std::function
, Главная1 Операции - это копия/перемещение, разрушение и «вызов» с operator()
- Функция как оператор вызова '.
На менее заумном английском это означает, что std::function
может содержать практически любой объект, который действует как указатель функции в том, как вы его называете.
Подпись, которую она поддерживает, заходит внутри угловых кронштейнов: std::function<void()>
Понимает нулевые аргументы и ничего не возвращает. std::function< double( int, int ) >
берет два int
аргументы и возврат double
. Анкет В целом, std::function
Поддерживает хранение любого функционального объекта, аргументы которых могут быть преобразованы в список аргументов, и возвращаемое значение которого можно преобразовать в его возвратное значение.
Важно знать, что std::function
и Lambdas разные, если совместимы, звери.
Следующая часть линии - лямбда. Это новый синтаксис в C ++ 11, чтобы добавить возможность писать простые функциональные объекты-объекты, которые можно вызвать с помощью ()
. Анкет Такие объекты могут быть стерты и хранятся в std::function
За счет некоторого времени на накладные расходы.
[](){ code }
В частности, действительно простая лямбда. Это соответствует этому:
struct some_anonymous_type {
some_anonymous_type() {}
void operator()const{
code
}
};
экземпляр вышеуказанного простого псевдофункционального типа. Фактический класс, подобный вышеуказанному, «изобретен» компилятором, с реализацией, определенной уникальным именем (часто включающим символы, которые не может содержать, определяемый пользователем) (я не знаю, возможно ли вы следовать стандарту без изобретения Такой класс, но каждый компилятор, о котором я знаю, на самом деле создает класс).
Синтаксис полного Lambda выглядит как:
[ capture_list ]( argument_list )
-> return_type optional_mutable
{
code
}
Но многие части могут быть опущены или оставлены пустыми. Capture_list соответствует как конструктору результирующего анонимного типа, так и его переменных членов, аргумент operator()
, и вернуть тип возврата типа. Конструктор экземпляра Lambda также волшебным образом называется, когда экземпляр создается с помощью capture_list.
[ capture_list ]( argument_list ) -> return_type { code }
в основном становится
struct some_anonymous_type {
// capture_list turned into member variables
some_anonymous_type( /* capture_list turned into arguments */ ):
/* member variables initialized */
{}
return_type operator()( argument_list ) const {
code
}
};
Обратите внимание, что в C ++ 20 Шаблонные аргументы были добавлены в Lambdas, и это не покрыто выше.
[]<typename T>( std::vector<T> const& v ) { return v.size(); }
1 Кроме того, хранится RTTI (TypeID), и входит операция типа листа в оригинальном типе.