Передача лямбда-функций другим методам

0

У лямбда-функции есть подпись, чтобы я мог их пропустить?

template<class Fn> 
HRESULT foreach(Fn _fuction)
{

}


object->foreach(
    [param1, param2] (int item) 
    {
    }
);

object->foreach(
    [param1, param2, param3] (int item) 
    {
    }
);

Я хочу использовать функцию typedef вместо шаблонов, я думаю, что тип функции будет строгать формальные параметры, но позволит перехватить список.

могу ли я использовать typedef вместо шаблонов для прохождения лямбда-функций?

что-то вроде:

typedef void (*Fn)(int);

но позволяет лямбда не работать с указателем.

Я попытался использовать std :: fuction, но, похоже, не работает.

  • 0
    Что бы ни стоило, использование типа шаблона не является плохим решением (конечно, в зависимости от контекста), поскольку при преобразовании в function возникают некоторые накладные расходы.
  • 2
    Клянусь, этот точный вопрос был задан как пару дней назад.
Показать ещё 2 комментария
Теги:
lambda

2 ответа

1

Тип лямбда-выражения (который также является типом объекта замыкания) является уникальным, неименованным non- классом типа union - называется типом замыкания...

(С++ 11 §5.1.2/3, акцент мой)

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

auto f = []{};
typedef decltype(f) lambda_type;
void g(lambda_type lambda) { lambda(); }
int main() {
    g(f);    // OK
    g([]{}); // error: type mismatch
}

Так что нет, то, что вы пытаетесь сделать, не может быть сделано. Как предложили другие, попробуйте использовать std::function или сохраните шаблон (что не так с шаблонами, так или иначе?)

0

Фактический тип лямбда не указан. Но они конвертируемы к function; в вашем случае std::function<void(int)> (void - это тип возвращаемого значения, типы параметров идут в круглые скобки).

  • 0
    да я пробовал, что, кажется, не работает, какой заголовок я должен включить?
  • 0
    Заголовок <functional>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню