SFINAE e detectando se um objeto de função C ++ retorna nulo

Eu li as várias autoridades sobre isso, incluemDewhurst e ainda não conseguimos chegar a lugar algum com essa pergunta aparentemente simples.

O que eu quero fazer éligar um C ++objeto de função, (basicamente, qualquer coisa que você possa chamar de função pura ou classe com ()) e retornar seu valor, se isso não for nulo, ou "true" caso contrário.

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

ATUALIZAR

Obrigado pelos pensamentos e idéias!

Com base nisso, eu decidi abrir todos os meus modelos de um nível - então, em vez disso, tenho:

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

e classes genéricas para transportar os vários objetos e métodos. Agradeço ao Mr.Ree pelo código que me levou nessa direção!

questionAnswers(6)

yourAnswerToTheQuestion