#include <string>
#include <iostream>
#include <boost/bind.hpp>
#include <boost/typeof/typeof.hpp>
struct overloaded
{
typedef int result_type;
int operator()(const std::string& s) const { return 1; }
int operator()(double d) const { return 2; }
};
struct factory
{
template <typename T> struct result { typedef BOOST_TYPEOF_TPL(boost::bind(overloaded(), T())) type; };
template <typename T>
typename result<T>::type operator()(T t) const
{
return boost::bind(overloaded(), t);
}
};
int main()
{
overloaded foo;
// based on local bind expression:
BOOST_AUTO(unresolved, boost::bind(foo, _1));
std::cout << unresolved("3.14") << std::endl; // should print 1
std::cout << unresolved(3.14) << std::endl; // should print 2
// based on a factory function template
factory makefoo;
std::cout << makefoo("3.14")() << std::endl; // should print 1
std::cout << makefoo(3.14)() << std::endl; // should print 2
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Ym9vc3QvYmluZC5ocHA+CiNpbmNsdWRlIDxib29zdC90eXBlb2YvdHlwZW9mLmhwcD4KCnN0cnVjdCBvdmVybG9hZGVkCnsKICAgIHR5cGVkZWYgaW50IHJlc3VsdF90eXBlOwoKICAgIGludCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSBjb25zdCB7IHJldHVybiAxOyB9CiAgICBpbnQgb3BlcmF0b3IoKShkb3VibGUgZCkgICAgICAgICAgICAgY29uc3QgeyByZXR1cm4gMjsgfQp9OwoKc3RydWN0IGZhY3RvcnkKewogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCByZXN1bHQgeyB0eXBlZGVmIEJPT1NUX1RZUEVPRl9UUEwoYm9vc3Q6OmJpbmQob3ZlcmxvYWRlZCgpLCBUKCkpKSB0eXBlOyB9OwoKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgdHlwZW5hbWUgcmVzdWx0PFQ+Ojp0eXBlIG9wZXJhdG9yKCkoVCB0KSBjb25zdCAKICAgIHsKICAgICAgICByZXR1cm4gYm9vc3Q6OmJpbmQob3ZlcmxvYWRlZCgpLCB0KTsKICAgIH0KfTsKCmludCBtYWluKCkKewogICAgb3ZlcmxvYWRlZCBmb287CgogICAgLy8gYmFzZWQgb24gbG9jYWwgYmluZCBleHByZXNzaW9uOgogICAgQk9PU1RfQVVUTyh1bnJlc29sdmVkLCBib29zdDo6YmluZChmb28sIF8xKSk7CiAgICBzdGQ6OmNvdXQgPDwgdW5yZXNvbHZlZCgiMy4xNCIpIDw8IHN0ZDo6ZW5kbDsgIC8vIHNob3VsZCBwcmludCAxCiAgICBzdGQ6OmNvdXQgPDwgdW5yZXNvbHZlZCgzLjE0KSAgIDw8IHN0ZDo6ZW5kbDsgIC8vIHNob3VsZCBwcmludCAyCgogICAgLy8gYmFzZWQgb24gYSBmYWN0b3J5IGZ1bmN0aW9uIHRlbXBsYXRlCiAgICBmYWN0b3J5IG1ha2Vmb287CiAgICBzdGQ6OmNvdXQgPDwgbWFrZWZvbygiMy4xNCIpKCkgPDwgc3RkOjplbmRsOyAgLy8gc2hvdWxkIHByaW50IDEKICAgIHN0ZDo6Y291dCA8PCBtYWtlZm9vKDMuMTQpKCkgICA8PCBzdGQ6OmVuZGw7ICAvLyBzaG91bGQgcHJpbnQgMgp9