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 &)>
?