Использовать лямбда-выражение в качестве параметра для функции C++

Я хотел бы использовать лямбда в качестве параметра для функции C++, но я не знаю, какой тип указать в объявлении функции. Что я хотел бы сделать это:

void myFunction(WhatToPutHere lambda){
    //some things
}

Я пробовал void myFunction(auto lambda) и void myFunction(void lambda) но ни один из этих кодов скомпилирован. Если это имеет значение, лямбда ничего не возвращает.

как я могу использовать лямбда в качестве параметра в функции C++?

3 ответов


У вас есть 2 способа: сделайте свой шаблон функции:

template <typename F>
void myFunction(F&& lambda){
    //some things
}

или стереть типа std::function

void myFunction(const std::function<void()/* type of your lamdba::operator()*/>& f){
    //some things
}

у вас есть два варианта, в принципе.

сделайте это шаблоном:

template<typename T>
void myFunction(T&& lambda){
}

или, если вы не хотите (или не можете) сделать это, вы можете использовать type-erased std::function:

void myFunction(std::function<void()> const& lambda){
}

наоборот, ваша попытка с auto было бы правильно под концепциями TS, как в настоящее время реализовано в gcc, где это было бы сокращенно шаблон.

// hypothetical C++2x code
void myFunction(auto&& lambda){
}

или с понятием:

// hypothetical C++2x code
void myFunction(Callable&& lambda){
}

если это inline функция, предпочитает шаблон, как в

template<typename Func>
void myFunction(Func const&lambda)
{
    //some things
}

потому что он привязывается ко всему, что имеет смысл (и вызовет ошибку компилятора для чего-либо еще), включая лямбды, экземпляры именованных классов и std::function<> объекты.

С другой стороны, если эта функция не inline, т. е. реализованный в некоторой единице компиляции, вы не можете использовать общий шаблон, но должны использовать указанный тип, который лучше всего взять std::function<> объект и переданный через ссылка.