Tôi có một đoạn mã như thế này:chức năng Nội đối phó với biến từ phạm vi
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()));
Ngoài các iterator ma thuật tăng mà có thể không được quá obvoius đây mà không có ý kiến, tôi muốn xác định một hàm double alpha()
để giảm trùng lặp. Nhưng vì việc sử dụng hàm này rất cụ thể, tôi muốn biến nó thành một hàm cục bộ. Lý tưởng nhất là:
int a, b;
int sum(){ return a + b; }
a = 5; b = 6;
int s = sum(); // s = 11
a = 3;
s = sum(); // s = 9 now
Trong các ngôn ngữ như Python, điều này hoàn toàn ổn, nhưng cách thực hiện điều này trong C++?
EDIT:
Đây là những gì tôi đã kết thúc với, đặc biệt nhờ vào @wilx và -std=c++0x
biên dịch cờ:
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++ không có chức năng lồng nhau. Có một phần mở rộng trong GCC cho phép nó mặc dù, và trong tiêu chuẩn C++ 11 có [hàm lambda] (http://en.wikipedia.org/wiki/C%2B%2B11#Lambda_functions_and_expressions) có thể được sử dụng thay thế. –
Có lý do nào để sử dụng 'danh sách' thay vì' vectơ' không? Bạn sẽ không cần gia số lặp của hacky nếu bạn sử dụng 'vector'. Xem xét cũng chỉ sử dụng 'cặp' nếu danh sách luôn có hai phần tử. –