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";
}