Вам нужна перегрузка по входному параметру функции. Просто проверку условия if/else надо переложить на плечи перегруженных методов, универсально внутри метода сравнить нельзя. Сделайте вспомогательную шаблонную функцию.
template<typename T>
struct type2type { typedef T type; }
temlate<typename U, typename T>
U helper_func(T const& method, type2type<GetX>) { return [](){return 1;}; }
temlate<typename U, typename T>
U helper_func(T const& method, type2type<ToString>) { return [](){return "aaaa";}; }
// и вызов
template <typename T>
std::result_of<typename T::signature> func(T const& method) {
return helper_func<std::result_of<typename T::signature>, T>(method, type2type<T>());
}