Mam fragment kodu:funkcje wewnętrzne czynienia ze zmiennymi z zakresu
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()));
Oprócz iteratora przyrost magii, która nie może być zbyt obvoius tutaj bez uwag, chciałbym zdefiniować funkcja polegająca na zmniejszeniu duplikacji. Ale ponieważ użycie tej funkcji jest bardzo specyficzne, chciałbym uczynić ją funkcją lokalną. Idealnie:
int a, b;
int sum(){ return a + b; }
a = 5; b = 6;
int s = sum(); // s = 11
a = 3;
s = sum(); // s = 9 now
W językach takich jak Python byłoby to całkowicie ok, ale jak to zrobić w C++?
EDIT:
To, co skończyło się, dzięki specjalnej @wilx a flaga -std=c++0x
kompilator:
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++ nie pełnią funkcji zagnieżdżonych. Istnieje rozszerzenie w GCC, które pozwala na to, ale w standardzie C++ 11 istnieją funkcje lambda (http://en.wikipedia.org/wiki/C%2B%2B11#Lambda_functions_and_expressions), które mogą być używane zamiast. –
Czy istnieje powód, aby użyć 'listy' zamiast' wektora'? Nie potrzebujesz hackowskich iteratorów, jeśli używałeś 'wektora'. Rozważ także użycie tylko "pary", jeśli listy mają zawsze dwa elementy. –