2 votes

expression lambda et déduction de modèles contre std::function : pourquoi cela fonctionne-t-il ?

Ma question est quelque peu liée à cette question : Lambdas et std::function . Veuillez lire cette question et sa réponse acceptée.

Ainsi, la réponse acceptée dit que le code suivant fait réussir la déduction des paramètres de template contre les lambdas, mais pourquoi ?

template<class T>
struct Identity{
  typedef T type;//why this helps?
};

template<typename BaseT>
vector<BaseT> findMatches(vector<BaseT> search, 
    typename Identity<function<bool (const BaseT &)>>::type func)
{
    vector<BaseT> tmp;

    for(auto item : search)
    {
        if( func(item) )
        {
            tmp.push_back(item);
        }
    }

    return tmp;
}

void Lambdas()
{
    vector<int> testv = { 1, 2, 3, 4, 5, 6, 7 };

    auto result = findMatches(testv, [] (const int &x) { return x % 2 == 0; });//lambda here.

    for(auto i : result)
    {
        cout << i << endl;
    }
}

int main(int argc, char* argv[])
{

    Lambdas();

    return EXIT_SUCCESS;
}

Le code ci-dessus fonctionne, mais je ne sais pas pourquoi. Tout d'abord, je sais que la déduction du modèle de BaseT ne se produit pas pour lambda car c'est un contexte non déductible( Identify<function<bool (const BaseT &)>>::type ). Au lieu de cela, BaseT est déduit de testv como int et la substitution des paramètres du modèle se fait dans Identity<function<bool (const BaseT &)>>::type .

Mais quelle est la suite ? après la substitution, Identity<function<bool (const BaseT &)>>::type devient function<bool (const BaseT &)> Mais l'expression lambda n'est-elle pas de ce type, et les conversions ne se produisent pas dans la déduction de paramètres de modèle (bien que la substitution de paramètres de modèle existe) ?

Merci pour vos explications ! P.S. Je crois savoir que le compilateur génère une classe à nom unique pour chaque expression lambda. Alors pourquoi lambda peut correspondre avec function<bool (const BaseT &)> ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X