web-dev-qa-db-fra.com

Utiliser un lambda comme paramètre pour une fonction C++

J'aimerais utiliser un lambda en tant que paramètre pour une fonction C++, mais je ne sais pas quel type spécifier dans la déclaration de la fonction. Ce que j'aimerais faire est la suivante:

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

J'ai essayé void myFunction(auto lambda) et void myFunction(void lambda) mais aucun de ces codes n'a été compilé. Au cas où cela serait important, le lambda ne renverra rien.

Comment utiliser un lambda en tant que paramètre dans une fonction C++?

14
Donald Duck

Vous avez 2 possibilités: créer votre modèle de fonction:

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

ou effacez le type avec std::function

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

Vous avez deux choix, fondamentalement.

Faites-en un modèle:

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

ou, si vous ne voulez pas (ou ne pouvez pas) faire cela, vous pouvez utiliser le type std::function effacé:

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

Réciproquement, votre tentative avec auto aurait été correcte avec les concepts TS actuellement appliqués dans gcc, où il s'agirait d'un modèle abrégé .

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

ou avec un concept:

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

S'il s'agit d'une fonction inline, préférez un modèle, comme dans

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

car il se lie à tout ce qui a du sens (et causera une erreur de compilation pour tout le reste), y compris les lambdas, les instances de classes nommées et les objets std::function<>.

D’autre part, si cette fonction n’est pas inline, c’est-à-dire implémentée dans une unité de compilation, vous ne pouvez pas utiliser un modèle générique, mais vous devez utiliser un type spécifié, qui vaut mieux prendre un objet std::function<> et le transmettre par référence.

0
Walter