Estoy tratando de resolver un problema que las funciones anónimas hacen mucho, mucho más fácil, y me preguntaba si esto era posible en C++.Posible tener funciones anónimas de C++ con boost?
Lo que me gustaría hacer es (esencialmente)
template<typename T>
T DoSomething(T one, function<T(T)> dosomething)
{
return one + dosomething(5);
}
void GetMyVal(...)
{
DoSomething<int>(1, /*anonymous func here*/)
}
Este ejemplo es muy, muy simplificada de lo que tengo que hacer. En C#, haría p => p * 5. Sé que esto es fácil con C++ 0x, pero no puedo usar eso. Siento que debería ser capaz de hacerlo con boost :: lambda, o una compilación de la función boost :: bind and boost :: con marcadores de posición, pero parece que no puedo hacer que funcione. Esto puede no ser posible y eso también está bien, pero por favor responda si no es posible. Gracias.
EDITAR: Ok, parece que el caso simple de un int funciona bien, ¿qué tal una estructura más complicada? Por lo tanto, vamos a tratar
struct NumHolder
{
int x;
}
template<typename T>
T DoSomething(T one, function<T(NumHolder)> dosomething)
{
NumHolder temp;
temp = 5
return one + dosomething(temp);
}
void GetMyVal(...)
{
DoSomething<int>(1, /*anonymous func here*/)
}
Aquí mi C# sería la expresión en la línea de p => p.temp * 5. ¿Es esto posible hacerlo en C++ con impulso?
EDIT 2: Bien, ahora solo tengo curiosidad: D ¿Cómo puedo llamar a una función dentro de la expresión lambda? Entonces, si tenemos
int ChangeVal(int mult)
{
return mult*5;
}
struct NumHolder
{
int x;
}
template<typename T>
T DoSomething(T one, function<T(NumHolder)> dosomething)
{
NumHolder temp;
temp = 5
return one + dosomething(temp);
}
void GetMyVal(...)
{
DoSomething<int>(1, /*anonymous func here*/)
}
En C# podría llamar a p => ChangeVal (p). ¿Cuál sería la sintaxis para esto con las expresiones C++ lambda?
¿Es "mucho, mucho más fácil" guardar 5 líneas de declarar functor? – ima
@ima: esta es la versión realmente simple de lo que tengo que hacer. de lo contrario, tengo docenas de funtores. En este caso, es mucho más fácil, simplemente no sabía la sintaxis – Steve
No es sintaxis, se trata de plantillas enredadas que intentan implementar una gramática personalizada encima de C++. Es posible, pero me cuesta imaginar una situación en la que ahorrar algunas líneas de código valga ese precio. Tenga compasión por un tipo pobre manteniendo su código uno o dos años después ... – ima