#include <iostream>
#include <type_traits>
using namespace std;
class Foo {};
class Bar {};
struct Functor1
{
static double functor(const Foo &) { return 2.2; }
};
struct Functor2
{
static int functor(const Bar &) { return 3; }
};
template<typename Operand>
auto test(const Operand &operand) -> decltype(Functor1::functor(operand))
{
return Functor1::functor(operand);
}
template<typename Operand>
auto test(const Operand &operand) -> decltype(Functor2::functor(operand))
{
return Functor2::functor(operand);
}
int main() {
cout << test(Foo()) << endl << test(Bar());
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBGb28ge307CmNsYXNzIEJhciB7fTsKCnN0cnVjdCBGdW5jdG9yMQp7CiAgICBzdGF0aWMgZG91YmxlIGZ1bmN0b3IoY29uc3QgRm9vICYpIHsgcmV0dXJuIDIuMjsgfQp9OwoKc3RydWN0IEZ1bmN0b3IyCnsKICAgIHN0YXRpYyBpbnQgZnVuY3Rvcihjb25zdCBCYXIgJikgeyByZXR1cm4gMzsgfQp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgT3BlcmFuZD4KYXV0byB0ZXN0KGNvbnN0IE9wZXJhbmQgJm9wZXJhbmQpIC0+IGRlY2x0eXBlKEZ1bmN0b3IxOjpmdW5jdG9yKG9wZXJhbmQpKQp7CiAgICByZXR1cm4gRnVuY3RvcjE6OmZ1bmN0b3Iob3BlcmFuZCk7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIE9wZXJhbmQ+CmF1dG8gdGVzdChjb25zdCBPcGVyYW5kICZvcGVyYW5kKSAtPiBkZWNsdHlwZShGdW5jdG9yMjo6ZnVuY3RvcihvcGVyYW5kKSkKewogICAgcmV0dXJuIEZ1bmN0b3IyOjpmdW5jdG9yKG9wZXJhbmQpOwp9CgppbnQgbWFpbigpIHsKCWNvdXQgPDwgdGVzdChGb28oKSkgPDwgZW5kbCA8PCB0ZXN0KEJhcigpKTsKCXJldHVybiAwOwp9