2012-05-21 23 views
6

tengo una función que requiere un puntero a función como argumento:C++ función se unen para su uso como argumento de otra función

int func(int a, int (*b)(int, int)) 
{ 
    return b(a,1); 
} 

Ahora quiero utilizar una determinada función que tiene tres argumentos en esta función:

int c(int, int, int) 
{ 
    // ... 
} 

¿Cómo puedo enlazar el primer argumento de c por lo que soy capaz de hacer:

int i = func(10, c_bound); 

He estado mirando std::bind1st pero parece que no puedo resolverlo. No devuelve un puntero a la función ¿no? Tengo plena libertad para adaptar func por lo que cualquier cambio de enfoque es posible. Aunque me gustaría que el usuario de mi código pueda definir su propio c ...

tenga en cuenta que lo anterior es una simplificación feroz de las funciones reales que estoy usando.

El proyecto lamentablemente requiere C++98.

Respuesta

12

No puede hacer eso. Tendría que modificar func para tomar primero un objeto función. Algo así como:

int func(int a, std::function< int(int, int) > b) 
{ 
    return b(a, rand()); 
} 

De hecho, no hay necesidad de b ser un std::function, podría ser templated lugar:

template< typename T > 
int func(int a, T b) 
{ 
    return b(a, rand()); 
} 

pero me gustaría seguir con la versión std::function para mayor claridad y un poco menos salida complicada del compilador en errores.

allí tendría que ser capaz de hacer algo como:

int i = func(10, std::bind(&c, _1, _2, some-value)); 

Nota todo esto es C++ 11, pero se puede hacer en C++ 03 usando Boost.

+2

aunque Necesitaba el código C++ 98, esta respuesta se convirtió fácilmente en su equivalente de impulso. – romeovs

1

Bueno, no sé si en tiempo de compilación, lo que tiene que unirse con c, se podría definir una nueva función

int c_bound(int a, int b) { 
    return c(a,b,some_value); 
} 

Eso obviamente no es una solución genérica, pero podría resolver su problema actual. De lo contrario, la solución de K-ballo parece ser la única genérica fácil. Sin embargo, eso requiere que pueda cambiar la firma de func. Si realmente tiene una API que no puede tocar la firma, y ​​aún necesita vincular un argumento Y si la solución anterior no resuelve su caso específico: (Precaución, exceso de tareas por delante) Siempre he querido usar un LLVM solución basada para compilar una función en tiempo de ejecución y pasar su dirección en tales situaciones.

0

No podría usar una función de 3 argumentos como una función de 2 argumentos; Principalmente porque no hay una manera real de determinar qué haría el 3er parámetro.

Mientras que la respuesta anterior funcionaría, aquí es otra opción:

Si uno de los parámetros para c(), en uso dentro de func, es constante, se podría escribir una función de contenedor para c(int, int, int):

int d(int a, int b) 
{ 
    return c(a, b, 0); //use a constant parameter 
} 

o, si se puede determinar el tercero parámetro de los dos parámetros dados, se puede también tratar:

int e(int a, int b) 
{ 
    int extra = 0; 
    ///Determine extra from a, and b 
    return c(a, b, c); 
} 
Cuestiones relacionadas