fork download
  1. #include <type_traits>
  2.  
  3. template<typename Func, typename Arg, typename Enable = void>
  4. struct has_call_with_arg1 : public std::false_type {};
  5.  
  6. template<typename Func, typename Arg>
  7. struct has_call_with_arg1<Func, Arg,
  8. decltype(std::declval<Func&>()(std::declval<Arg&>()))>
  9. : public std::true_type {};
  10.  
  11. namespace has_call_with_arg_impl {
  12. template<typename F, typename A>
  13. std::true_type test(decltype(std::declval<F&>()(std::declval<A&>()))*);
  14.  
  15. template<typename F, typename A>
  16. std::false_type test(...);
  17. }
  18.  
  19. template <typename Func, typename Arg>
  20. struct has_call_with_arg2
  21. : public decltype(has_call_with_arg_impl::test<Func,Arg>(nullptr)) {};
  22.  
  23. struct X {};
  24. struct Y {
  25. void operator()(X);
  26. };
  27.  
  28. int main() {
  29. static_assert(has_call_with_arg1<void(int), int>::value, "Line 1");
  30. static_assert(has_call_with_arg1<Y, X>::value, "Line 2");
  31. static_assert(!has_call_with_arg1<Y, int>::value, "Line 3");
  32. static_assert(has_call_with_arg2<void(int), int>::value, "Line 4");
  33. static_assert(has_call_with_arg2<Y, X>::value, "Line 5");
  34. static_assert(!has_call_with_arg2<Y, int>::value, "Line 6");
  35. }
Success #stdin #stdout 0s 2892KB
stdin
Standard input is empty
stdout
Standard output is empty