Это плохо, что лямбда-выражения 0x C++ не имеют именованного типа?

Существует FileOptions. Опция DeleteOnClose, которая могла бы сделать то, что Вы хотите.

Вот ссылка на страница MSDN .

6
задан GRB 29 September 2009 в 18:41
поделиться

2 ответа

Лямбды - это независимые типы. Код

void h(lambda func)
{
     func(2);
}

не имеет никакого смысла, потому что лямбда-выражения не имеют полиморфизма времени выполнения. Напомним, что лямбда эквивалентна

struct unique_name
{
    return_type operator()(Arg1 a1, Arg2 a2, ... , Argn an)
    {
        code_inside_lambda;
    }
}

, который сам по себе является уникальным типом. Приведенный выше код будет таким же, как

void h(class C)
{
     C(2);
}

, что также не имеет смысла, даже если мы гарантируем, что C имеет operator () . Вам нужен шаблон:

template<typename T>
void g(T func)
{
     func(2);
}

int main()
{
    g([](int x){return x + 2;});
}
11
ответ дан 8 December 2019 в 17:24
поделиться

Я не вижу причин различать типы функций в зависимости от того, есть у функции имя или нет. Лямбда-функции - это просто сокращение, позволяющее легко определять удобную функцию. Имя или отсутствие имени, поведение функции при вызове такое же.

Подумайте об этом так. В ранней версии вашего программного обеспечения есть предикат, определенный как анонимная функция. Со временем требования усложняются, и ваш предикат тоже становится более сложным - и, возможно, вам нужно вызвать его из более чем одного места. Разумно провести рефакторинг, чтобы у вас была именованная функция.

Нет причин, по которым вызываемая функция (та, которая вызывает предикат) должна заботиться об этом. Простой или сложный, именованный или анонимный - это все еще просто функция-предикат.

Одна небольшая проблема заключается в замыканиях - я не проверял, но, если повезет, C ++ получит вложенные именованные функции с замыканиями, а также лямбды.

3
ответ дан 8 December 2019 в 17:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: