2009-08-26 19 views
5

En el pasado, he utilizado las funciones bind1st y bind2nd para realizar operaciones directas en contenedores STL. Ahora tengo un contenedor de punteros de clase myBase que son por causa de simplicidad lo siguiente:Uso de STL para vincular múltiples argumentos de función

 
class X 
{ 
public: 
    std::string getName() const; 
}; 

Quiero llamar a la siguiente función estática por medio de for_each y vinculante tanto para el 1º y 2º parámetros como tal:

StaticFuncClass :: doSomething (ptr-> getName(), funcReturningString());

¿Cómo usaré for_each y vincularé ambos parámetros de esta función?

Busco algo en la línea de:

 
for_each(ctr.begin(), ctr.end(), 
     bind2Args(StaticFuncClass::doSomething(), 
        mem_fun(&X::getName), 
        funcReturningString()); 

veo Boost ofrece una función de enlace de su propio que se ve como algo que sería de utilidad aquí, pero ¿cuál es la solución STL?

Gracias de antemano por sus respuestas.

+0

Para que quede claro, para cada elemento en 'e' la secuencia, ¿desea llamar a 'StaticFuncClass :: doSomething (e.getName(), funcReturningString())'? – jalf

+0

sí ... técnicamente sería e-> getName() porque los elementos en el contenedor son punteros. –

Respuesta

13

Un repliegue fiable cuando el bind-sintaxis pone demasiado raro es definir su propio funtor:

struct callDoSomething { 
    void operator()(const X* x){ 
    StaticFuncClass::doSomething(x->getName(), funcReturningString()); 
    } 
}; 

for_each(ctr.begin(), ctr.end(), callDoSomething()); 

Esto es más o menos lo que los bind funciones hacen detrás de las escenas de todos modos.

+0

+1 Sí, había pensado en eso también. Me preguntaba si había una forma en línea para hacerlo, como enlazar solo 1 de los 2 usando bind1st o bind2nd. –

+0

No hay necesidad de un constructor, sin embargo. – xtofl

+1

Podría ser posible con las funciones de vinculación STL, pero se pone un poco demasiado peludo para mí. Prefiero el enfoque de functor. Por supuesto, en C++ 0x podrías definirlo en línea con un lambda – jalf

4

La "solución STL" sería escribir su propia carpeta ... es por eso que crearon el poderoso boost :: bind.

+2

powerfool? : p – jalf

+0

eh eh :) corregido! – UncleZeiv

3

Puede crear una estructura funtor local, que puede ser inline por el compilador (como se mostró Jalf), o utilizar una función simple:

void myFunc(const X* x) { 
    StaticFuncClass::doSomething(x->getName(), funcrReturningString()); 
} 

for_each(c.begin(), c.end(), myFunc); 
+1

el & no debería ser necesario. Las funciones se pueden convertir implícitamente a punteros de función, por lo que simplemente 'myFunc' funcionaría como unfaik. – jalf

+0

Tienes razón. No es necesario Mal hábito, me temo. – xtofl

Cuestiones relacionadas