L'appel d'une fonction membre en utilisant boost :: lambda
-
19-09-2019 - |
Question
J'apprends la bibliothèque boost::lambda
et que j'ai écrit cet exemple de code pour convertir un vector<A>
en vector<int>
en extrayant la valeur de l'objet de A
.
class A
{
public:
A(int n) : m_n(n){}
int get() const {return m_n;}
private:
int m_n;
};
int _tmain(int argc, _TCHAR* argv[])
{
using namespace boost::lambda;
std::vector<A> a1;
std::vector<int> a2;
a1.push_back(A(10));
a1.push_back(A(20));
std::for_each(a1.begin(), a1.end(), bind(&std::vector<int>::push_back, var(a2), bind(&A::get, _1)));
return 0;
}
Je pourrais obtenir la partie for_each
au travail après plusieurs essais. Mais je ne comprends toujours pas l'air de semblable à ces multiples se fixe. Est-il une autre façon d'écrire cela. De préférence, je voudrais faire quelque chose comme:. a2.push_back(bind(&A::get,_1));
, mais cela ne compile pas
La solution
Je ne pense pas que ce que vous essayez de faire est possible. for_each
applique la fonction à chaque élément de la gamme, mais vous essayez d'appeler deux fonctions membres et vous devrez les lier à la fois. Je pense que votre code est le meilleur que vous pouvez faire lorsque vous utilisez for_each
. Lambda documentation est très complète pour moi, mais il n'y a pas d'exemple pour ce que vous essayez de faire. Je pense qu'il est pour une raison, il existe un algorithme plus approprié pour cela. Comme Kirill a dit qu'il est transform
.
std::transform(a1.begin(), a1.end(), std::back_inserter(a2), bind(&A::get, _1));