#include <iostream>
#include <functional>
#include <vector>
class OtherThing{
public:
void addElement(std::function<int()> func){
this->myfuncs.push_back(func);
}
void toggle(){
std::cout << "toggle .. " << this->myfuncs[0]() << std::endl;
}
private:
std::vector<std::function<int()>> myfuncs;
};
class Thing: public OtherThing{
public:
Thing(){
std::function<int()> myfunc= [this]()->int{
std::cout << "from lambda " << this->value << std::endl;
return this->value;
};
this->addElement(myfunc);
}
Thing(const Thing &src){
value = src.value;
std::function<int()> myfunc = [this]()->int{
std::cout << "from copied lambda " << this->value << std::endl;
return this->value;
};
this->addElement(myfunc);
}
void setValue(int value){
this->value = value;
}
int getValue(){
return this->value;
}
private:
int value;
};
int main() {
// container for things
std::vector<Thing> mythings;
// a thing
Thing a;
a.toggle();
a.setValue(100);
a.toggle();
mythings.push_back(a);
mythings[0].toggle();
mythings[0].setValue(666);
mythings[0].toggle();
mythings[0].setValue(999);
mythings[0].toggle();
a.toggle();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHZlY3Rvcj4KCmNsYXNzIE90aGVyVGhpbmd7CnB1YmxpYzoKdm9pZCBhZGRFbGVtZW50KHN0ZDo6ZnVuY3Rpb248aW50KCk+IGZ1bmMpewogICAgdGhpcy0+bXlmdW5jcy5wdXNoX2JhY2soZnVuYyk7Cn0Kdm9pZCB0b2dnbGUoKXsKICAgIHN0ZDo6Y291dCA8PCAidG9nZ2xlIC4uICIgPDwgdGhpcy0+bXlmdW5jc1swXSgpIDw8IHN0ZDo6ZW5kbDsKfQpwcml2YXRlOgpzdGQ6OnZlY3RvcjxzdGQ6OmZ1bmN0aW9uPGludCgpPj4gbXlmdW5jczsgCn07CgpjbGFzcyBUaGluZzogcHVibGljIE90aGVyVGhpbmd7CnB1YmxpYzoKVGhpbmcoKXsKICAgIHN0ZDo6ZnVuY3Rpb248aW50KCk+IG15ZnVuYz0gW3RoaXNdKCktPmludHsKICAgICAgICBzdGQ6OmNvdXQgPDwgImZyb20gbGFtYmRhICIgPDwgdGhpcy0+dmFsdWUgPDwgc3RkOjplbmRsOwogICAgICAgIHJldHVybiB0aGlzLT52YWx1ZTsKICAgICAgICB9OwogICAgdGhpcy0+YWRkRWxlbWVudChteWZ1bmMpOwogICAgfQpUaGluZyhjb25zdCBUaGluZyAmc3JjKXsKCXZhbHVlID0gc3JjLnZhbHVlOwoJc3RkOjpmdW5jdGlvbjxpbnQoKT4gbXlmdW5jID0gW3RoaXNdKCktPmludHsKCQlzdGQ6OmNvdXQgPDwgImZyb20gY29waWVkIGxhbWJkYSAiIDw8IHRoaXMtPnZhbHVlIDw8IHN0ZDo6ZW5kbDsKCQlyZXR1cm4gdGhpcy0+dmFsdWU7Cgl9OwoJdGhpcy0+YWRkRWxlbWVudChteWZ1bmMpOwp9CnZvaWQgc2V0VmFsdWUoaW50IHZhbHVlKXsKICAgIHRoaXMtPnZhbHVlID0gdmFsdWU7Cn0KaW50IGdldFZhbHVlKCl7CiAgICByZXR1cm4gdGhpcy0+dmFsdWU7Cn0KcHJpdmF0ZToKaW50IHZhbHVlOwp9OwoKCmludCBtYWluKCkgewogICAgLy8gY29udGFpbmVyIGZvciB0aGluZ3MgCiAgICBzdGQ6OnZlY3RvcjxUaGluZz4gbXl0aGluZ3M7CiAgICAKICAgIC8vIGEgdGhpbmcKICAgIFRoaW5nIGE7CiAgICBhLnRvZ2dsZSgpOwogICAgYS5zZXRWYWx1ZSgxMDApOwogICAgYS50b2dnbGUoKTsKICAgIAogICAgbXl0aGluZ3MucHVzaF9iYWNrKGEpOwogICAgbXl0aGluZ3NbMF0udG9nZ2xlKCk7CiAgICBteXRoaW5nc1swXS5zZXRWYWx1ZSg2NjYpOwogICAgbXl0aGluZ3NbMF0udG9nZ2xlKCk7CiAgICBteXRoaW5nc1swXS5zZXRWYWx1ZSg5OTkpOwogICAgbXl0aGluZ3NbMF0udG9nZ2xlKCk7CiAgICAKICAgIGEudG9nZ2xlKCk7CiAgICAKICAgIHJldHVybiAwOwp9