Ho una funzione wrapper in C++ 11, progettato per essere utilizzato con lambda, in questo modo:In C++ 11, come si specializza un modello di funzione che accetta un oggetto funzione in base al tipo restituito?
template<typename Func>
int WrapExceptions(Func&& f)
{
try
{
return f();
}
catch(std::exception)
{
return -1;
}
}
E mi può chiamare in questo modo:
int rc = WrapExceptions([&]{
DoSomething();
return 0;
});
assert(rc == 0);
E la vita è OK. Quello che voglio fare, però, è sovraccarico o specializzarsi la funzione wrapper in modo tale che quando la funzione interna restituisce void, la funzione esterna restituisce un valore di default pari a 0, ad esempio:
int rc = WrapExceptions([&]{
DoSomething();
});
assert(rc == 0);
Posso effettivamente fare questo in C++ 11? Non posso per la vita di me pensare a come.
Dai un'occhiata alla std :: result_of. http://en.cppreference.com/w/cpp/types/result_of –