fork download
  1. #include <iostream>
  2. #include <string>
  3. #include <cstdlib>
  4. #define P(x) std::cout<<x<<std::endl
  5.  
  6. struct Scalar { std::string data = "scalar"; };
  7. struct Array { std::string data = "array"; };
  8.  
  9.  
  10. template<typename ReturnT = void>
  11. ReturnT test() {}
  12.  
  13. template<>
  14. void test() { P("param: void, return: void"); }
  15.  
  16. template<>
  17. Scalar test() { P("param: void, return: scalar"); return Scalar(); }
  18.  
  19. template<>
  20. Array test() { P("param: void, return: array"); return Array(); }
  21.  
  22.  
  23. template<typename ReturnT = void, typename ParamT>
  24. ReturnT test(ParamT x) {}
  25.  
  26. template<>
  27. void test(Scalar x) { P("param: scalar, return: void"); }
  28.  
  29. template<>
  30. void test(Array x) { P("param: array, return: void"); }
  31.  
  32. template<>
  33. Scalar test(Scalar x) { P("param: scalar, return: scalar"); return Scalar(); }
  34.  
  35. template<>
  36. Array test(Array x) { P("param: array, return: array"); return Array(); }
  37.  
  38.  
  39. int main()
  40. {
  41. test();
  42. Scalar a = test<Scalar>();
  43. Array b = test<Array>();
  44. Scalar c = test<Scalar, Scalar>(Scalar());
  45. Array d = test<Array, Array>(Array());
  46. test<void, Scalar>(Scalar());
  47. test<void, Array>(Array());
  48. }
  49.  
  50.  
  51.  
  52.  
Success #stdin #stdout 0s 15240KB
stdin
Standard input is empty
stdout
param: void, return: void
param: void, return: scalar
param: void, return: array
param: scalar, return: scalar
param: array, return: array
param: scalar, return: void
param: array, return: void