septembre
2010
Après avoir abordé le Trailing return type dans mon dernier billet, passons aux « Expressions lambda ».
Considérons la classe ci-dessous :
{
public:
Adherent(LPCTSTR szNom,LPCTSTR szPrenom,const int nAge)
{
if(szNom==nullptr || szPrenom==nullptr || nAge<=0)
AfxThrowInvalidArgException();
m_strNom=szNom;
m_strPrenom=szPrenom;
m_nAge=nAge;
}
public:
CString m_strNom,m_strPrenom;
int m_nAge;
};
Cette classe très simple permet d’enregistrer les informations d’un adhérent,
Supposons maintenant que je maintienne un tableau en mémoire de mes adhérents et que je veuille le trier par l’âge de l’adhérent.
Je vais « naturellement » utiliser la classe vector et un foncteur pour trier mon vector.
Le code ressemblera donc à ceci :
{
bool operator()(const Adherent &ad1,const Adherent &ad2) const
{
return ad1.m_nAge < ad2.m_nAge;
}
};
L’utilisation plus loin dans le code donnera ceci:
vAdherent.push_back(Adherent(_T("Marcel"),_T("dupont"),50));
vAdherent.push_back(Adherent(_T("alain"),_T("machin"),60));
vAdherent.push_back(Adherent(_T("patrick"),_T("meyer"),30));
std::sort(vAdherent.begin(),vAdherent.end(),SortAdherentAge());
Les foncteurs sont un moyen très puissant pour personnaliser les algorithmes standard de la STL, malheureusement leur définition est peu pratique car elle nécessite d’écrire une classe entière comme SortAdherentAge dans mon exemple.
Le second défaut est que cette classe n’est pas définit à l’emplacement dans le code source où on va l’utiliser, ce qui rend leur utilisation plus difficile.
C’est là qu’intervient les expressions lambda qui vont gommer tous ces défauts.
Reprenons maintenant le même exemple :
vAdherent.push_back(Adherent(_T("Marcel"),_T("dupont"),50));
vAdherent.push_back(Adherent(_T("alain"),_T("machin"),60));
vAdherent.push_back(Adherent(_T("patrick"),_T("meyer"),30));
std::sort(vAdherent.begin(),vAdherent.end(),
[](const Adherent &ad1,const Adherent &ad2)->bool{ return ad1.m_nAge < ad2.m_nAge;});
L’expression lambda débute avec l’écriture de “[]”, la déclaration des paramètres ad1 et ad2 fournissent au compilateur les paramètres de la pseudo-fonction anonyme.
Le type de retour de la fonction est précisé par « ->bool », le corps de la fonction est exprimé entre les deux accolades.
Avec les expressions lambda parcourir le tableau et réaliser un traitement « inline » devient beaucoup plus facile :
[](const Adherent &ad)
{
TRACE("\n %d",ad.m_nAge);
}
);
Consultez MSDN pour plus de renseignements sur les syntaxes possibles.
Articles récents
Commentaires récents
Archives
- septembre 2010
- mai 2010
- avril 2010
- février 2010
- août 2009
- juin 2009
- mai 2009
- février 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- juillet 2008
- juin 2008
- mai 2008
- avril 2008
- mars 2008
- février 2008
- janvier 2008
- décembre 2007
- novembre 2007
- septembre 2007
- août 2007
- juillet 2007
- juin 2007
- mai 2007
- avril 2007
- mars 2007
- février 2007
- janvier 2007
- décembre 2006
- novembre 2006
- octobre 2006
- septembre 2006
- août 2006
- juillet 2006
- juin 2006
- mai 2006
- mars 2006
- février 2006