fork download
  1. #include <iostream>
  2. #include <type_traits>
  3. #include <iomanip>
  4.  
  5. template <typename Functor>
  6. struct tester : std::integral_constant<int, 0>{};
  7.  
  8. template <typename Res, typename... Args>
  9. struct tester<Res(Args...)> : std::integral_constant<int, 1>{};
  10.  
  11. template <typename Res, typename... Args>
  12. struct tester<Res(Args......)> : std::integral_constant<int, 2>{};
  13.  
  14. #define STR_EXPAND(tok) #tok
  15. #define STR(tok) STR_EXPAND(tok)
  16. #define TEST_PARAM_1 void(*)(int, int)
  17. #define TEST_PARAM_2 void(int, char, std::ostream&)
  18. #define TEST_PARAM_3 void()
  19.  
  20. int main(){
  21. using std::setw;
  22. std::cout
  23. << setw(65)<< STR(TEST_PARAM_1) ": " << tester<TEST_PARAM_1>::value << "\n"
  24. << setw(65)<< STR(TEST_PARAM_2) ": " << tester<TEST_PARAM_2>::value << "\n"
  25. << setw(65)<< STR(TEST_PARAM_3) ": " << tester<TEST_PARAM_3>::value << "\n";
  26. }
Success #stdin #stdout 0s 2852KB
stdin
Standard input is empty
stdout
                                              void(*)(int, int): 0
                                 void(int, char, std::ostream&): 1
                                                         void(): 1