16 сентября 2010

Local functions in C++

В Pascal есть замечательная вещь - локальные функции. Иногда они ну ооочень удобны. Если кто с Паскалем не знаком, на C++ это бы выглядело примерно так:
int foo(int x)
{
int y = 0;

void bar(int z)
{
y += x*z;
}

bar(1);
bar(2);

return y;
}
То есть тело такой функции пишется внутри другой функции, и она может ссылать на ее переменные.
В C++ такого счастья нет. Может такого не сделали из-за того, что в Сях стек устроен немного по-другому, нежели в Паскале (в любом случае - не оправдание), может Бьярн счел это "не тру". Конечно, можно написать локальный класс, у которого будет нужная функция, но которому придется вручную передавать нужные переменные - но это неудобно, да и выглядит ужасно. Вот как-то так:
int foo(int x)
{
int y = 0;

class foobar
{
public:
bar(int &y, int x) : y(y), x(x)
{
}

void operator ()(int z)
{
y += x*z;
}

private:
int &y, x;
} bar(y, x);

bar(1);
bar(2);

return y;
}
Но с новым стандартом этот способ стал гораздо короче в записи:
int foo(int x)
{
int y = 0;

auto bar = [&](int z)
{
y += x*z;
};

bar(1);
bar(2);

return y;
}
Если сравнить с кодом, приведенным в начале - отличия минимальны! А уж если оно выглядит как утка, плавает как утка и крякает как утка - то чем не утка локальная функция?!