Substituição SFINAE para std :: result_of

A implementação do GNU C ++ 11 de std::result_ofnão contém o typedef typepara métodos que retornam void. Isso não está de acordo com a política SFINAE . Aqui está um substituto simples para o traço de tipo que funciona.

template<typename Expr>
class result_of;

template<typename F, typename... Args>
struct result_of<F(Args...)>
{
typedef decltype(std::declval<F>()(std::declval<Args>()...)) type;
};