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!