Некоторое время назад я читал Javascript: The Good Parts и узнал, что в джаваскрипте нет уровней приватности членов, поэтому там делают энкапсуляцию с помощью лямбд. Я задумался, можно ли сделать так же в C++?
Простейший случай с одним замыканием - можно:
#include <iostream>
auto get_counter() {
int i {0};
return [=]() mutable {
return i++;
};
}
int main() {
auto counter = get_counter();
for (auto i = 0; i < 6; ++i) {
std::cout << counter() << std::endl;
}
}
// выведет 0, 1, 2, 3, 4, 5,
Но в джаваскрипте я могу сделать что-то еще интереснее:
var create_counter = function() {
var i = 0;
var increment = function() {
i++;
return i;
};
var reset = function() {
i = 0;
};
var counter = {
increment: increment,
reset: reset
};
return counter;
};
var counter = create_counter();
for (var j = 0; j < 5; j++) {
console.log(counter.increment());
}
counter.reset();
console.log(counter.increment());
Выведет
1
2
3
4
5
1
Видно, что у функций increment и reset захвачена общая переменная i, и они ее могут обе читать и менять. Как так же сделать в C++?