fork(1) download
  1. #include <iostream>
  2. #include <type_traits>
  3.  
  4. template<class OutType>
  5. struct A
  6. {
  7.  
  8. template<typename T = OutType, typename... Args>
  9. typename std::enable_if<std::is_same<T, void>::value>::type
  10. operator()(Args && ... args)
  11. {
  12. std::cout << "void (args)" << std::endl;
  13. }
  14.  
  15. template<typename T = OutType>
  16. typename std::enable_if<std::is_same<T, void>::value>::type
  17. operator()()
  18. {
  19. std::cout << "void (void)" << std::endl;
  20. }
  21.  
  22. template<typename T = OutType, typename... Args>
  23. typename std::enable_if<!std::is_same<T, void>::value, OutType>::type
  24. operator()(Args && ... args)
  25. {
  26. std::cout << "!void (args)" << std::endl;
  27. return OutType();
  28. }
  29.  
  30. template<typename T = OutType>
  31. typename std::enable_if<!std::is_same<T, void>::value, OutType>::type
  32. operator()()
  33. {
  34. std::cout << "!void (void)" << std::endl;
  35. return OutType();
  36. }
  37. };
  38.  
  39. int main()
  40. {
  41. A<int> a1;
  42.  
  43. a1(56, 'e');
  44. a1();
  45.  
  46. A<void> a2;
  47.  
  48. a2(13, 0.66f);
  49. a2();
  50.  
  51. return 0;
  52. }
Success #stdin #stdout 0s 16064KB
stdin
Standard input is empty
stdout
!void (args)
!void (void)
void (args)
void (void)