Frage

Ich habe Probleme, herauszufinden, mem_fun_ref. Ich muss zugeben, dass ich in der Regel verwenden functors für diese Art der Sache, da sie für die Geschwindigkeit und Gewinn inlined werden kann. Jedoch ist dieser Code nicht zu einem Engpass und so wollte sein werde ich dieses Ding versuchen.

Hier ist ein Beispiel dafür, was ich tun möchte. Ich weiß, dass es andere Möglichkeiten gibt, es zu tun. Ich will nicht copy verwenden, ich möchte nicht, Bereich Mitgliederfunktionen verwenden, ich will keinen back_inserter verwenden. Ich möchte speziell mem_fun_ref verwenden. Dies ist nur ein einfaches Beispiel, das wirklich der Fall ist viel komplizierter. Das heißt, ich weiß wirklich nicht, warum dies falsch ist, aber ich bin nicht mit mem_fun_ref oder mem_fun.

Hier ist, was ich arbeiten will:

#include <list>
#include <vector>
#include <algorithm>
#include <functional>

using namespace std;

int main()
{
    list<int> a;
    a.push_back(1);
    a.push_back(2);
    a.push_back(3);
    vector<int> b;

    // should work like magic!
    for_each(a.begin(), a.end(), bind1st(mem_fun_ref(&vector<int>::push_back), b));
}

Aber ich bekomme 3 Fehler:

1>c:\program files\microsoft visual studio 9.0\vc\include\functional(276) : error C2529: '_Right' : reference to reference is illegal
1>c:\program files\microsoft visual studio 9.0\vc\include\functional(281) : error C2529: '_Right' : reference to reference is illegal
1>c:\program files\microsoft visual studio 9.0\vc\include\functional(282) : error C2535: 'void std::binder1st<_Fn2>::operator ()(const int &(&)) const' : member function already defined or declared
1>        with
1>        [
1>            _Fn2=std::mem_fun1_ref_t<void,std::vector<int>,const int &>
1>        ]
1>        c:\program files\microsoft visual studio 9.0\vc\include\functional(276) : see declaration of 'std::binder1st<_Fn2>::operator ()'
1>        with
1>        [
1>            _Fn2=std::mem_fun1_ref_t<void,std::vector<int>,const int &>
1>        ]

reference to reference is illegal macht ich denke, dass die Funktion einen Parameter nach Wert zu übernehmen muss. Aber natürlich ist dies nicht möglich, in vector zu ändern, und es ist nicht möglich, sie entweder in meinem Code zu ändern. Gibt es eine einfache Änderung dieses zur Arbeit zu kommen? Ich brauche eine Lösung, die ein 1-Liner ist.

War es hilfreich?

Lösung

Just bind verwenden. Die mem_fun Versionen sind zu schwer.

for_each(a.begin(), a.end(),
  boost::bind(&vector<int>::push_back, boost::ref(b), _1));

Eine andere Art und Weise, die nicht die Verwendung von ref benötigt wird ein Zeiger auf den Vektor passieren geändert werden:

for_each(a.begin(), a.end(),
  boost::bind(&vector<int>::push_back, &b, _1));

Andere Tipps

Dieses Problem ist in "Exceptional C ++ Style" von Herb Sutter, Seite 28-30 erläutert wurde. Man kann wohl nicht sicher einen Zeiger auf eine vector<int>::push_back Methode erstellen als ein genauen Signatur der Member-Funktion sicher sein muss, die nicht offensichtlich auch in der Standardbibliothek für vector<int>::push_back sein können. Dies liegt daran, (in der Standardbibliothek):

  1. Ein Mitglied Funktionssignatur mit Standardparametern könnte durch „zwei oder mehr Elementfunktion Signaturen mit gleichwertigem Verhalten ersetzt werden.
  2. Ein Mitglied Funktionssignatur möglicherweise zusätzliche notleidenden Parameter.

Am Ende Herb Sutter darauf hingewiesen, dass

  1. Verwenden Sie mem_fun, einfach nicht mit der Standardbibliothek
  2. Verwenden Sie Zeiger auf Elementfunktionen, nur nicht mit der Standardbibliothek

Ich weiß, dass Sie gesagt haben Sie nicht wollen, back_inserter verwenden, wahrscheinlich, weil Sie nur vereinfachte Beispielcode gegeben haben.

Für alle anderen Fragen, wie tun genau , was Sie versuchen zu tun, und glücklich, es zu benutzen, verwenden back_inserter:

std::copy(a.begin(), a.end(), std::back_inserter(b));

Das heißt, es gibt immer other_mem_fun , die ich bis gekocht, bevor ich über boost wusste. Dies könnte passen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top