tengo un fragmento de código como este:funciones internas que se ocupan de las variables del ámbito
std::list<boost::shared_ptr<Point> > left, right;
// ... fill lists ...
// now, calculate the angle between (right[0], right[1]) and (right[0], left[0])
double alpha = angle(*(right.begin()->get()), *(((++right.begin()))->get()), *(left.begin()->get()));
std::cout << alpha * 180/M_PI << std::endl;
if(alpha < 0){
// do something with the lists, like reversing them. Especially the beginning and end of the lists may change in some way, but "left" and "right" are not reassigned.
}
// calculate the new alpha
alpha = angle(*(right.begin()->get()), *(((++right.begin()))->get()), *(left.begin()->get()));
Aparte de la magia de la subasta iterador que puede no ser demasiado obvoius aquí sin los comentarios, me gustaría definir una función double alpha()
para reducir la duplicación. Pero debido a que el uso de esta función es muy específico, me gustaría que sea una función local. Lo ideal sería así:
int a, b;
int sum(){ return a + b; }
a = 5; b = 6;
int s = sum(); // s = 11
a = 3;
s = sum(); // s = 9 now
En lenguajes como Python esto sería perfectamente bien, pero ¿cómo hacer esto en C++?
EDIT:
Esto es lo que terminó con, especial gracias a @wilx y la bandera -std=c++0x
compilador:
auto alpha = [&right, &left]() {
// not 100% correct due to my usage of boost::shared_ptr, but to get the idea
Point r_first = *(right.begin());
Point l_first = *(left.begin());
Point r_second = *(++right.begin());
return angle(r_first, r_second, l_first);
};
if(alpha() < 0) // fix it
double new_alpha = alpha();
C++ no tienen funciones anidadas. Sin embargo, hay una extensión en GCC que lo permite, y en el estándar C++ 11 hay [funciones lambda] (http://en.wikipedia.org/wiki/C%2B%2B11#Lambda_functions_and_expressions) que podrían usarse en lugar. –
¿Hay alguna razón para usar una 'lista' en lugar de un' vector'? No necesitarías los incrementos de iterador hacky si usaras un 'vector'. Considere también usar solo un 'par 'si las listas siempre tienen dos elementos. –