2009-08-26 11 views
7

Estoy tratando de crear objetos nuevos y agregarlos a una lista de objetos usando boost :: bind. Por ejemplo.Uso de boost :: bind con un constructor

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) 
) 
); 

Esto no parece funcionar. ¿Hay alguna forma de usar un constructor con boost :: bind, o debería probar con algún otro método?

+0

¿Qué quiere decir "seem to work"? no está compilado o la lista no está poblada? – Dewfy

+1

El código Som que realmente compila ayudaría. ¿Qué es "a"? Parece que tiene métodos de inicio y fin de recopilación, pero también algún miembro. –

+0

jon, eso fue un error de mi parte. Está arreglado ahora. Dewfy, el código no compila. –

Respuesta

5

Si Stuff::some_member es int y Object tiene una ctor no explícita de tomar una int, esto debería funcionar:

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

De lo contrario, podría utilizar boost::lambda::constructor

+0

Simplifiqué un poco mi código. El constructor en mi código real tomó tres argumentos, por lo que en el truco de conversión implícita no funciona. Sin embargo, el enlace respondió mi pregunta por completo. Gracias. –

0

Depende de qué devuelva a::some_member - si es Object, entonces no debería ser necesario envolver el resultado en un ctor Object - ya habrá sido construido. Si la rutina no devuelve un Object, es probable que deba realizar un masaje en el resultado un poco, que puede extraer con boost::bind, pero una función de utilidad puede mantener el código más legible.

En cualquier caso, más código ayudaría, específicamente la instancia de tipo de a y Object.

+0

Cambié el código un poco. Digamos que tengo un constructor Object (int) y Stuff :: some_member es un int. Básicamente mi pregunta es, ¿puede algo de la forma boost :: bind (Object, ...) alguna vez funcionar, o los constructores simplemente no están permitidos como un argumento para enlazar? –

3

enlace de Eric dice, en parte, "Es no es posible tomar la dirección de un constructor, por lo tanto, los constructores no se pueden usar como funciones de destino en expresiones de enlace. " Entonces, lo que estaba tratando de hacer era imposible.

llegué a su alrededor creando una función:

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

y el uso de Object_factory donde yo estaba tratando de usar el constructor de objetos.

11

Si está utilizando boost 1.43, puede usar boost :: factory y boost :: value_factory, que le permiten encapsular una invocación de constructor. Me gusta esto:

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