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 | #include <boost/variant.hpp> #include <boost/function.hpp> #include <boost/foreach.hpp> #include <map> #include <string> #include <iostream> typedef boost::variant<boost::function<int()>, boost::function<float()>, boost::function<double()> > Callback; typedef std::map<std::string, Callback> CallbackType; CallbackType mCallbacks; void Foo(const std::string& name, const Callback& f) { mCallbacks[name] = f; } //------------------------------------------------------------------------------ float f() { std::cout << "f called" << std::endl; return 4; } int g() { std::cout << "g called" << std::endl; return 5; } double h() { std::cout << "h called" << std::endl; return 4; } //------------------------------------------------------------------------------ struct call_visitor : public boost::static_visitor<> { template <typename T> void operator() (const T& operand) const { operand(); } }; int main () { Foo("f", boost::function<float()>( f )); Foo("g", boost::function<int()>( g )); Foo("h", boost::function<double()>( h )); BOOST_FOREACH(CallbackType::value_type &row, mCallbacks) { boost::apply_visitor(call_visitor(), row.second); } return 0; } |
ICAgICNpbmNsdWRlIDxib29zdC92YXJpYW50LmhwcD4KICAgICNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CiAgICAjaW5jbHVkZSA8Ym9vc3QvZm9yZWFjaC5ocHA+CiAgICAjaW5jbHVkZSA8bWFwPgogICAgI2luY2x1ZGUgPHN0cmluZz4KICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KICAgIAogICAgdHlwZWRlZiBib29zdDo6dmFyaWFudDxib29zdDo6ZnVuY3Rpb248aW50KCk+LAogICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6ZnVuY3Rpb248ZmxvYXQoKT4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpmdW5jdGlvbjxkb3VibGUoKT4gPiBDYWxsYmFjazsKICAgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIENhbGxiYWNrPiBDYWxsYmFja1R5cGU7CiAgICAKICAgIENhbGxiYWNrVHlwZSBtQ2FsbGJhY2tzOwogICAgCiAgICB2b2lkIEZvbyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgQ2FsbGJhY2smIGYpIHsKICAgIAltQ2FsbGJhY2tzW25hbWVdID0gZjsKICAgIH0KICAgIAogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgZmxvYXQgZigpIHsgCiAgICAJc3RkOjpjb3V0IDw8ICJmIGNhbGxlZCIgPDwgc3RkOjplbmRsOwogICAgCXJldHVybiA0OwogICAgfQogICAgCiAgICBpbnQgZygpIHsKICAgIAlzdGQ6OmNvdXQgPDwgImcgY2FsbGVkIiA8PCBzdGQ6OmVuZGw7CiAgICAJcmV0dXJuIDU7CiAgICB9CiAgICAKICAgIGRvdWJsZSBoKCkgewogICAgCXN0ZDo6Y291dCA8PCAiaCBjYWxsZWQiIDw8IHN0ZDo6ZW5kbDsKICAgIAlyZXR1cm4gNDsKICAgIH0KICAgIAogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgc3RydWN0IGNhbGxfdmlzaXRvciA6IHB1YmxpYyBib29zdDo6c3RhdGljX3Zpc2l0b3I8PiB7CiAgICAJdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICAJdm9pZCBvcGVyYXRvcigpIChjb25zdCBUJiBvcGVyYW5kKSBjb25zdCB7CiAgICAJCW9wZXJhbmQoKTsKICAgIAl9CiAgICB9OwogICAgCiAgICAKICAgIGludCBtYWluICgpIHsKICAgIAlGb28oImYiLCBib29zdDo6ZnVuY3Rpb248ZmxvYXQoKT4oIGYgKSk7CiAgICAJRm9vKCJnIiwgYm9vc3Q6OmZ1bmN0aW9uPGludCgpPiggZyApKTsKICAgIAlGb28oImgiLCBib29zdDo6ZnVuY3Rpb248ZG91YmxlKCk+KCBoICkpOwogICAgCQkKICAgIAlCT09TVF9GT1JFQUNIKENhbGxiYWNrVHlwZTo6dmFsdWVfdHlwZSAmcm93LCBtQ2FsbGJhY2tzKSB7CiAgICAJCWJvb3N0OjphcHBseV92aXNpdG9yKGNhbGxfdmlzaXRvcigpLCByb3cuc2Vjb25kKTsKICAgIAl9CiAgICAKICAgIAlyZXR1cm4gMDsKICAgIH0=
-
upload with new input
-
result: Success time: 0s memory: 3000 kB returned value: 0
f called g called h called


