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!