fork download
  1. #include <tuple>
  2. #include <utility>
  3.  
  4. template<typename Func, typename R, typename Args, typename=void>
  5. struct will_return_helper: std::false_type {};
  6.  
  7. template<typename Func, typename R, typename... Args>
  8. struct will_return_helper<
  9. Func, R, std::tuple<Args...>,
  10. typename std::enable_if<
  11. std::is_same<
  12. R,
  13. decltype( std::declval<Func&>()( std::declval<Args>()... ) )
  14. >::value
  15. >::type
  16. >
  17. : std::true_type {};
  18.  
  19. template<typename Func, typename R, typename... Args>
  20. struct will_return: will_return_helper< typename std::decay<Func>::type, R, std::tuple<Args...> > {};
  21.  
  22. #include <iostream>
  23. struct Foo {
  24. int operator()(double) {return 0;}
  25. };
  26. int main()
  27. {
  28. std::cout << "1 = "<< will_return< int(), int >::value << "\n";
  29. std::cout << "1 = "<< will_return< int(*)(), int >::value << "\n";
  30. std::cout << "0 = "<< will_return< int(*)(), double >::value << "\n";
  31. std::cout << "1 = "<< will_return< Foo, int, double >::value << "\n";
  32. std::cout << "1 = "<< will_return< Foo, int, int >::value << "\n";
  33. std::cout << "0 = "<< will_return< Foo, double, int >::value << "\n";
  34. }
Success #stdin #stdout 0s 2896KB
stdin
Standard input is empty
stdout
1 = 1
1 = 1
0 = 0
1 = 1
1 = 1
0 = 0