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

Était-ce utile?

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));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top