Обернутые лямбда-выражения - PullRequest
1 голос
/ 16 сентября 2011

Вот определенное выражение оболочки lamba:

function <int(double)> f = 
     [](double x) -> int{ return static_cast <int> (x*x); };

Используется так:

f(someintvalue);

В чем разница между обычными функциями и обернутыми лямбдами?

Ответы [ 2 ]

2 голосов
/ 16 сентября 2011

Вопрос в том, в чем разница между обычной функцией и упакованной лямбда?

Нормальная функция - это обычная функция, и то, что вы называете «упакованной лямбда», на самом деле является объектом функции.1005 *

Кстати, а зачем использовать std::function?Вы могли бы просто написать это:

auto f = [](double x) { return static_cast <int> (x*x); };

//call
int result = f(100.0);

Кроме того, я опустил тип возвращаемого значения, так как он неявно известен компилятору из выражения возврата.Не нужно писать -> int в лямбда-выражении.

1 голос
/ 16 сентября 2011

Лямбды могут захватывать окружающую область ([=] или [&]), что приводит к анонимным структурам, содержащим функцию-член.

Определенные задачи, такие как доступ к лямбда (типам) через единицы перевода или получение стандартного указателяАдреса -to-functionfunction из lambdas могут оказаться трудными / бесполезными, поскольку фактический тип автоматически сгенерированного «анонимного» типа не может быть известен (и фактически определяется реализацией).

std::function<> был разработан для точного облегчения проблема : возможность привязки указателя функции (семантически) к лямбде (или даже к любому вызываемому объекту )


1 : на самом деле тип может иметь внешнюю связь, но вы не можете переносимо ссылаться на это из другой единицы перевода, потому что фактический тип определяется реализацией (и даже не нужно дажебыть выразимым в коде C ++; в исходном TU вы сможете использовать decltype, чтобы получить магический тип . Спасибо, Люк за липучкуD точность об этом)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...