2009-08-26 20 views
7

Sto cercando di creare nuovi oggetti e aggiungerli a un elenco di oggetti utilizzando boost :: bind. Per esempio.Uso di boost :: binding con un costruttore

struct Stuff {int some_member;}; 
struct Object{ 
    Object(int n); 
}; 
.... 
list<Stuff> a; 
list<Object> objs; 
.... 
transform(a.begin(),a.end(),back_inserter(objs), 
    boost::bind(Object, 
    boost::bind(&Stuff::some_member,_1) 
) 
); 

Questo non sembra funzionare. C'è un modo per usare un costruttore con boost :: bind, o dovrei provare qualche altro metodo?

+0

Cosa significa "sembra funzionare"? non è compilato o la lista non è popolata? – Dewfy

+1

Il codice Som che effettivamente compila sarebbe d'aiuto. Che cos'è "a": sembra che abbiano i metodi di inizio e fine della raccolta ma anche alcuni_member? –

+0

jon, è stato un errore da parte mia. È riparato ora. Dewfy, il codice non viene compilato. –

risposta

5

Se Stuff::some_member è int e Object ha un ctor non esplicita l'assunzione di un int, questo dovrebbe funzionare:

list<Stuff> a; 
list<Object> objs; 
transform(a.begin(),a.end(),back_inserter(objs), 
    boost::bind(&Stuff::some_member,_1) 
); 

In caso contrario, è possibile utilizzare boost::lambda::constructor

+0

Ho semplificato un po 'troppo il mio codice. Il costruttore nel mio codice reale ha preso tre argomenti, quindi in trucco implicito il trucco non funziona. Il link ha risposto completamente alla mia domanda. Grazie. –

0

Dipende da cosa restituisce a::some_member - se si tratta di un Object, non è necessario avvolgere il risultato in un Object ctor: sarà già stato creato. Se la routine non restituisce un Object, è probabile che sia necessario eseguire un leggero massaggio del risultato, che è possibile utilizzare con boost::bind ma una funzione di utilità potrebbe mantenere il codice più leggibile.

In entrambi i casi, sarebbe utile più codice, in particolare l'istanza di tipo a e Object.

+0

Ho cambiato il codice un po '. Diciamo che ho un costruttore Object (int) e Stuff :: some_member è un int. Fondamentalmente la mia domanda è, può qualcosa del modulo boost :: bind (Object, ...) mai funzionare, oppure i costruttori non sono ammessi come argomento per legare? –

3

collegamento di Éric dice, in parte "E ' non è possibile prendere l'indirizzo di un costruttore, quindi i costruttori non possono essere usati come funzioni di destinazione nelle espressioni di binding. " Quindi quello che stavo cercando di fare era impossibile.

ho ottenuto intorno ad esso con la creazione di una funzione:

Object Object_factory(int n) 
{ return Object(n); } 

e utilizzando Object_factory in cui stavo cercando di utilizzare il costruttore oggetto.

11

Se si utilizza boost 1.43, è possibile utilizzare boost :: factory e boost :: value_factory, che consentono di incapsulare un'invocazione del costruttore. In questo modo:

transform(a.begin(),a.end(),back_inserter(objs), 
    boost::bind(boost::value_factory<Object>(), 
    boost::bind(&Stuff::some_member,_1) 
) 
); 
Problemi correlati