Эта библиотека позволяет программировать функции локально, в рамках других функций и непосредственно в пределах области, где они необходимы.
Местные функции(a.k.a.,вложенные функции)) являются формойинформации, скрывающей, и они полезны для разделения процедурных задач на подзадачи, которые имеют смысл только локально, избегая загромождения других частей программы функциями, переменными и т.д. Поэтому локальные функции дополняют другие возможности структурирования, такие как пространства имен и классы. Локальные функции являются особенностью многих языков программирования, в частностиPascalиAda, но отсутствуют вC++03(см. также[N2511])..
Используя лямбда-функцииC++11, можно реализовать локальные функции, называя лямбда-функции, присваивая их локальным переменным. Например (см. также<add_cxx11_lambda.cpp
>):
int main(void) {
int sum = 0, factor = 10;
auto add = [factor, &sum](int num) {
sum += factor * num;
};
add(1);
int nums[] = {2, 3};
std::for_each(nums, nums + 2, add);
BOOST_TEST(sum == 60);
return boost::report_errors();
}
Эта библиотека позволяет программировать локальные функции переносимо междуC++03иC++11(и с производительностью, сравнимой с лямбда-функциями на компиляторахC++11). Например (см. также<add.cpp
>):
int main(void) {
int sum = 0, factor = 10;
void BOOST_LOCAL_FUNCTION(const bind factor, bind& sum, int num) {
sum += factor * num;
} BOOST_LOCAL_FUNCTION_NAME(add)
add(1);
int nums[] = {2, 3};
std::for_each(nums, nums + 2, add);
BOOST_TEST(sum == 60);
return boost::report_errors();
}
Эта библиотека поддерживает следующие функции для локальных функций:
- Локальные функции могут захватывать, или лучшесвязывать, любую из переменных из ограждающей области (функция вместе с захваченными переменными также называетсязамыканием).
- Орган локальной функции программируется с использованием обычного синтаксиса С++ (как следствие, ошибки компилятора и отладка сохраняют привычное значение и формат).
- Локальные функции могут передаваться в качестве параметров шаблона, чтобы их можно было удобно использовать с алгоритмами STL и другими шаблонами.
- Однако локальные функции должны быть указаны в декларативном контексте (например, в точке кода, где могут быть объявлены локальные переменные), поэтому они не могут быть указаны в выражениях.
СмотретьАльтернативыраздела для сравнения этой библиотеки,C++11 лямбда-функций,Boost.Phoenixи других методов C++, реализующих функции, связанные с локальными функциями.