fork(1) download
  1. #include <iostream>
  2. #include <type_traits>
  3.  
  4. template<class X = void>
  5. struct holder
  6. {
  7. typedef void type;
  8. };
  9.  
  10. template<class F, class T, class X = void>
  11. struct is_callable_with_trait
  12. : std::false_type
  13. {};
  14.  
  15. template<class F, class T>
  16. struct is_callable_with_trait<F, T, typename holder<
  17. decltype(std::declval<F>()(std::declval<T>()))
  18. >::type>
  19. : std::true_type
  20. {};
  21.  
  22. template<typename T, typename F>
  23. constexpr bool is_callable_with(F&&)
  24. {
  25. return is_callable_with_trait<F&&, T>::value;
  26. }
  27.  
  28. void f1(int) {}
  29. void f2(void*) {}
  30.  
  31. template <bool b>
  32. struct print { static bool const value = b; };
  33.  
  34. int main() {
  35. std::cout << print< is_callable_with<int>(f1) >::value << "\n";
  36. std::cout << print< is_callable_with<int>(f2) >::value << "\n";
  37. return 0;
  38. }
Success #stdin #stdout 0s 3340KB
stdin
Standard input is empty
stdout
1
0