Использовать лямбда-выражение в качестве параметра для функции 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<>
объект и переданный через ссылка.