2016-08-04 30 views
0

würde Ich mag das gleiche Verhalten wie dies erhalten:Wie füllt man Vektor mit Werten, die von einer Elementfunktion in C++ 03 zurückgegeben werden?

IdentifiersGenerator gen; 
for(int i = 0; i < 100; ++i) 
    v.push_back(gen.getNextIdentifiers()); 

mit ähnlicher Syntax:

IdentifiersGenerator gen; 
std::vector<Identifiers> v(100); 
std::generate(v.begin(), v.end(), 
    std::bind1st(std::mem_fun(&IdentifiersGenerator::getNextIdentifiers), gen)); 

das obige Snippet gibt die folgende Fehlermeldung:

test/src/IdentifiersGeneratorTest.cpp:449: instantiated from here 
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/backward/binders.h:100: error: no type named ‘second_argument_type’ in ‘class std::mem_fun_t<const Identifiers&, IdentifiersGenerator>’ 
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/backward/binders.h:103: error: no type named ‘first_argument_type’ in ‘class std::mem_fun_t<const Identifiers&, IdentifiersGenerator>’ 
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/backward/binders.h:106: error: no type named ‘first_argument_type’ in ‘class std::mem_fun_t<const Identifiers&, IdentifiersGenerator>’ 
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/backward/binders.h:111: error: no type named ‘second_argument_type’ in ‘class std::mem_fun_t<const Identifiers&, IdentifiersGenerator>’ 
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/backward/binders.h:117: error: no type named ‘second_argument_type’ in ‘class std::mem_fun_t<const Identifiers&, IdentifiersGenerator>’ 
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/backward/binders.h: In function ‘std::binder1st<_Operation> std::bind1st(const _Operation&, const _Tp&) [with _Operation = std::mem_fun_t<const Identifiers&, IdentifiersGenerator>, _Tp = IdentifiersGenerator]’: 
test/src/IdentifiersGeneratorTest.cpp:449: instantiated from here 
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/backward/binders.h:126: error: no type named ‘first_argument_type’ in ‘class std::mem_fun_t<const Identifiers&, IdentifiersGenerator>’ 

Vielleicht kann dies auch ohne std::vector Standard-Objektinitialisierung mit z boost::make_function_input_iterator.

EDIT OK, ich habe so klar, dass ich so verwenden kann boost::bind wie:

std::vector<AlarmIdentifiers> v(100); 
std::generate(v.begin(), v.end(), 
    boost::bind(&IdentifiersGenerator::getNextIdentifiers, &gen)); 

Jeder kann einen Ansatz teilen, den Vektor mit Zeigern auf Elementfunktion statt konstruieren und dann Erzeugung im Innern zu initialisieren ?

+0

Ist es in Ordnung, eine Funktors zu machen? – NathanOliver

+0

Nein, ich brauche Memberfunktion 'IdentifiersGenerator :: getNextIdentifiers' – Patryk

+0

Sie können es mit einem Funktor erhalten. Ich frage, ob es okay ist, den Anruf in einem Funktor zu verpacken. – NathanOliver

Antwort

1

Der Grund dies nicht funktioniert:

std::bind1st(std::mem_fun(&IdentifiersGenerator::getNextIdentifiers), gen) 

ist, dass bind1st erfordert eine binäre Funktion während Sie ein einstellige ein bereitstellen. Es gibt keine vorgefertigte C++ 03-Lösung, wenn boost::bind eine Option ist, die ich einfach verwenden würde.

Andernfalls könnte Ihre eigene Factory schreiben, die einen Zeiger auf nullary Member-Funktion und einen Zeiger auf die Klasse übernimmt und ein Objekt mit operator() zurückgibt, das es aufruft.

0

(Posting hier nur als Referenz)

OK, so habe ich gemerkt, dass ich boost::bind wie so verwenden können:

std::vector<AlarmIdentifiers> v(100); 
std::generate(v.begin(), v.end(), 
    boost::bind(&IdentifiersGenerator::getNextIdentifiers, &gen)); 
0

binden ist wirklich ein ‚alten‘ und meist veraltet Weg, um etwas zu erreichen, ähnlich der viel schöneren Lambda-Syntax.

IdentifiersGenerator gen; 
std::vector<Identifiers> v(100); 
std::generate(v.begin(), v.end(), [&](){ return gen.getNextIdentifiers(); }); 

Sie auch generate_n verwenden könnte

+0

Wieder sind Lambdas C++ 11 und ich habe dies explizit markiert Frage als C++ 03 – Patryk