#include <tuple>
#include <utility>

template<typename Func, typename R, typename Args, typename=void>
struct will_return_helper: std::false_type {};

template<typename Func, typename R, typename... Args>
struct will_return_helper<
  Func, R, std::tuple<Args...>,
  typename std::enable_if<
    std::is_same<
      R,
      decltype( std::declval<Func&>()( std::declval<Args>()... ) )
    >::value
  >::type
>
: std::true_type {};

template<typename Func, typename R, typename... Args>
struct will_return: will_return_helper< typename std::decay<Func>::type, R, std::tuple<Args...> > {};

#include <iostream>
struct Foo {
  int operator()(double) {return 0;}
};
int main()
{
  std::cout << "1 = "<< will_return< int(), int >::value << "\n";
  std::cout << "1 = "<< will_return< int(*)(), int >::value << "\n";
  std::cout << "0 = "<< will_return< int(*)(), double >::value << "\n";
  std::cout << "1 = "<< will_return< Foo, int, double >::value << "\n";
  std::cout << "1 = "<< will_return< Foo, int, int >::value << "\n";
  std::cout << "0 = "<< will_return< Foo, double, int >::value << "\n";
}