SFINAE y detectar si un objeto de función C ++ devuelve vacío

He leído las diversas autoridades sobre esto, incluyenDesvanecimiento y, sin embargo, no he logrado llegar a ninguna parte con esta pregunta aparentemente simple.

Lo que quiero hacer esllamada un C ++objeto de función, (básicamente, cualquier cosa que pueda llamar, una función pura o una clase con ()), y devolver su valor, si eso no es nulo, o "verdadero" de lo contrario.

using std:

struct Foo {
  void operator()() { cout << "Foo/"l; }
};
struct Bar {
  bool operator()() { cout << "Bar/"; return true; }
};

Foo foo;
Bar bar;
bool baz() { cout << "baz/"; return true; }
void bang() { cout << "bang/"; }

const char* print(bool b) { cout << b ? "true/" : "false/"; }

template <typename Functor> bool magicCallFunction(Functor f) {
  return true;  // Lots of template magic occurs here 
                // that results in the functor being called.
}

int main(int argc, char** argv) {
  print(magicCallFunction(foo));
  print(magicCallFunction(bar));
  print(magicCallFunction(baz));
  print(magicCallFunction(bang));
  printf("\n");
}
// Results:  Foo/true/Bar/true/baz/true/bang/true

ACTUALIZAR

Gracias por los pensamientos e ideas!

En base a esto, en realidad decidí mostrar todos mis niveles de plantilla, así que en su lugar tengo:

bool eval(bool (*f)()) { return (*f)(); }

bool eval(void (*f)()) { (*f)(); return true; }

template <typename Type>
bool eval(Type* obj, bool (Type::*method)()) { return (obj->*method)(); }

template <typename Type>
bool eval(Type* obj, void (Type::*method)()) { (obj->*method)(); return true; }

y clases genéricas para transportar los diversos objetos y métodos. ¡Gracias a Mr.Ree por el código que me empujó en esa dirección!

Respuestas a la pregunta(6)

Su respuesta a la pregunta