1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | #include <iostream> #include <boost/variant.hpp> struct Cat{ void speak() const{ std::cout << "meow\n"; } void cat_extra() const{ std::cout << "Special cat move!\n"; } ~Cat(){ std::cout << "Cat died\n"; } }; struct Dog{ void speak() const{ std::cout << "wuff\n"; } void dog_extra() const{ std::cout << "Special dog move!\n"; } ~Dog(){ std::cout << "Dog died\n"; } }; struct Bird{ void speak() const{ std::cout << "chirp\n"; } void bird_extra() const{ std::cout << "Special bird move!\n"; } ~Bird(){ std::cout << "Bird died\n"; } }; struct Fish{ void speak() const{ std::cout << "blub\n"; } void fish_extra() const{ std::cout << "Special fish move!\n"; } ~Fish(){ std::cout << "Fish died\n"; } }; struct speak_visitor : boost::static_visitor<void> { template<class Animal> void operator()(Animal const* p) const{ p->speak(); } }; struct extra_visitor : boost::static_visitor<void> { void operator()(Cat const* p) const{ p->cat_extra(); } void operator()(Dog const* p) const{ p->dog_extra(); } void operator()(Bird const* p) const{ p->bird_extra(); } void operator()(Fish const* p) const{ p->fish_extra(); } }; struct delete_visitor : boost::static_visitor<void> { template<class Animal> void operator()(Animal const* p) const{ delete p; } }; int main(){ typedef boost::variant<Cat*, Dog*, Bird*, Fish*> variant_type; variant_type var; speak_visitor sv; delete_visitor dv; extra_visitor ev; var = new Cat(); var.apply_visitor(sv); var.apply_visitor(ev); var.apply_visitor(dv); var = new Dog(); var.apply_visitor(sv); var.apply_visitor(ev); var.apply_visitor(dv); var = new Bird(); var.apply_visitor(sv); var.apply_visitor(ev); var.apply_visitor(dv); var = new Fish(); var.apply_visitor(sv); var.apply_visitor(ev); var.apply_visitor(dv); } |
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Ym9vc3QvdmFyaWFudC5ocHA+CgpzdHJ1Y3QgQ2F0ewogIHZvaWQgc3BlYWsoKSBjb25zdHsgc3RkOjpjb3V0IDw8ICJtZW93XG4iOyB9CiAgdm9pZCBjYXRfZXh0cmEoKSBjb25zdHsgc3RkOjpjb3V0IDw8ICJTcGVjaWFsIGNhdCBtb3ZlIVxuIjsgfQogIH5DYXQoKXsgc3RkOjpjb3V0IDw8ICJDYXQgZGllZFxuIjsgfQp9OwoKc3RydWN0IERvZ3sKICB2b2lkIHNwZWFrKCkgY29uc3R7IHN0ZDo6Y291dCA8PCAid3VmZlxuIjsgfQogIHZvaWQgZG9nX2V4dHJhKCkgY29uc3R7IHN0ZDo6Y291dCA8PCAiU3BlY2lhbCBkb2cgbW92ZSFcbiI7IH0KICB+RG9nKCl7IHN0ZDo6Y291dCA8PCAiRG9nIGRpZWRcbiI7IH0KfTsKCnN0cnVjdCBCaXJkewogIHZvaWQgc3BlYWsoKSBjb25zdHsgc3RkOjpjb3V0IDw8ICJjaGlycFxuIjsgfQogIHZvaWQgYmlyZF9leHRyYSgpIGNvbnN0eyBzdGQ6OmNvdXQgPDwgIlNwZWNpYWwgYmlyZCBtb3ZlIVxuIjsgfQogIH5CaXJkKCl7IHN0ZDo6Y291dCA8PCAiQmlyZCBkaWVkXG4iOyB9Cn07CgpzdHJ1Y3QgRmlzaHsKICB2b2lkIHNwZWFrKCkgY29uc3R7IHN0ZDo6Y291dCA8PCAiYmx1YlxuIjsgfQogIHZvaWQgZmlzaF9leHRyYSgpIGNvbnN0eyBzdGQ6OmNvdXQgPDwgIlNwZWNpYWwgZmlzaCBtb3ZlIVxuIjsgfQogIH5GaXNoKCl7IHN0ZDo6Y291dCA8PCAiRmlzaCBkaWVkXG4iOyB9Cn07CgpzdHJ1Y3Qgc3BlYWtfdmlzaXRvcgogICAgOiBib29zdDo6c3RhdGljX3Zpc2l0b3I8dm9pZD4KewogICAgdGVtcGxhdGU8Y2xhc3MgQW5pbWFsPgogICAgdm9pZCBvcGVyYXRvcigpKEFuaW1hbCBjb25zdCogcCkgY29uc3R7CiAgICAgICAgcC0+c3BlYWsoKTsKICAgIH0KfTsKCnN0cnVjdCBleHRyYV92aXNpdG9yCiAgICA6IGJvb3N0OjpzdGF0aWNfdmlzaXRvcjx2b2lkPgp7CiAgICB2b2lkIG9wZXJhdG9yKCkoQ2F0IGNvbnN0KiBwKSBjb25zdHsKICAgICAgICBwLT5jYXRfZXh0cmEoKTsKICAgIH0KICAgIHZvaWQgb3BlcmF0b3IoKShEb2cgY29uc3QqIHApIGNvbnN0ewogICAgICAgIHAtPmRvZ19leHRyYSgpOwogICAgfQogICAgdm9pZCBvcGVyYXRvcigpKEJpcmQgY29uc3QqIHApIGNvbnN0ewogICAgICAgIHAtPmJpcmRfZXh0cmEoKTsKICAgIH0KICAgIHZvaWQgb3BlcmF0b3IoKShGaXNoIGNvbnN0KiBwKSBjb25zdHsKICAgICAgICBwLT5maXNoX2V4dHJhKCk7CiAgICB9Cn07CgpzdHJ1Y3QgZGVsZXRlX3Zpc2l0b3IKICAgIDogYm9vc3Q6OnN0YXRpY192aXNpdG9yPHZvaWQ+CnsKICAgIHRlbXBsYXRlPGNsYXNzIEFuaW1hbD4KICAgIHZvaWQgb3BlcmF0b3IoKShBbmltYWwgY29uc3QqIHApIGNvbnN0ewogICAgICAgIGRlbGV0ZSBwOwogICAgfQp9OwoKaW50IG1haW4oKXsKICAgIHR5cGVkZWYgYm9vc3Q6OnZhcmlhbnQ8Q2F0KiwgRG9nKiwgQmlyZCosIEZpc2gqPiB2YXJpYW50X3R5cGU7CiAgICB2YXJpYW50X3R5cGUgdmFyOwogICAgc3BlYWtfdmlzaXRvciBzdjsKICAgIGRlbGV0ZV92aXNpdG9yIGR2OwogICAgZXh0cmFfdmlzaXRvciBldjsKCiAgICB2YXIgPSBuZXcgQ2F0KCk7CiAgICB2YXIuYXBwbHlfdmlzaXRvcihzdik7CiAgICB2YXIuYXBwbHlfdmlzaXRvcihldik7CiAgICB2YXIuYXBwbHlfdmlzaXRvcihkdik7CgogICAgdmFyID0gbmV3IERvZygpOwogICAgdmFyLmFwcGx5X3Zpc2l0b3Ioc3YpOwogICAgdmFyLmFwcGx5X3Zpc2l0b3IoZXYpOwogICAgdmFyLmFwcGx5X3Zpc2l0b3IoZHYpOwoKICAgIHZhciA9IG5ldyBCaXJkKCk7CiAgICB2YXIuYXBwbHlfdmlzaXRvcihzdik7CiAgICB2YXIuYXBwbHlfdmlzaXRvcihldik7CiAgICB2YXIuYXBwbHlfdmlzaXRvcihkdik7CgogICAgdmFyID0gbmV3IEZpc2goKTsKICAgIHZhci5hcHBseV92aXNpdG9yKHN2KTsKICAgIHZhci5hcHBseV92aXNpdG9yKGV2KTsKICAgIHZhci5hcHBseV92aXNpdG9yKGR2KTsKfQ==
-
upload with new input
-
result: Success time: 0s memory: 2936 kB returned value: 0
meow Special cat move! Cat died wuff Special dog move! Dog died chirp Special bird move! Bird died blub Special fish move! Fish died


