template <typename T, typename K, K (T::*F)() const = &T::operator K>
struct Foo
{
K retrieve(const T & t) { return (t.*F)(); }
};
struct X { operator int() const { return 12; } };
#include <iostream>
int main()
{
std::cout << Foo<X, int>().retrieve(X()) << "\n";
}
dGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEssIEsgKFQ6OipGKSgpIGNvbnN0ID0gJlQ6Om9wZXJhdG9yIEs+CnN0cnVjdCBGb28KewogICAgSyByZXRyaWV2ZShjb25zdCBUICYgdCkgeyByZXR1cm4gKHQuKkYpKCk7IH0KfTsKCnN0cnVjdCBYIHsgb3BlcmF0b3IgaW50KCkgY29uc3QgeyByZXR1cm4gMTI7IH0gfTsKCiNpbmNsdWRlIDxpb3N0cmVhbT4KCmludCBtYWluKCkKewogICAgc3RkOjpjb3V0IDw8IEZvbzxYLCBpbnQ+KCkucmV0cmlldmUoWCgpKSA8PCAiXG4iOwp9