fork download
  1. #include <iostream>
  2.  
  3. template<int N>
  4. struct NumWriter1 {
  5. static void write() {
  6. std::cout << "Передано число " << N << std::endl;
  7. }
  8. };
  9.  
  10. template<>
  11. struct NumWriter1<0> {
  12. static void write() {
  13. std::cout << "Передан нолик" << std::endl;
  14. }
  15. };
  16.  
  17. template<int N1, int N2>
  18. struct NumWriter2 {
  19. static void write() {
  20. std::cout << "Переданы числа " << N1 << " и " << N2 << std::endl;
  21. }
  22. };
  23.  
  24. template<int N2>
  25. struct NumWriter2<0, N2> {
  26. static void write() {
  27. std::cout << "Передан нолик и число " << N2 << std::endl;
  28. }
  29. };
  30.  
  31. template<int N1>
  32. struct NumWriter2<N1, 0> {
  33. static void write() {
  34. std::cout << "Передано число " << N1 << " и нолик" << std::endl;
  35. }
  36. };
  37.  
  38. // Если удалить специализацию ниже, то будет ошибка компиляции, потому что
  39. // NumWriter2<0, 0>::write(); подходит как для специализации <0, N2>, так и
  40. // для <N1, 0> и неясно какую выбирать.
  41. template<>
  42. struct NumWriter2<0, 0> {
  43. static void write() {
  44. std::cout << "Переданы два нолика" << std::endl;
  45. }
  46. };
  47.  
  48.  
  49.  
  50. int main() {
  51. NumWriter1<10>::write();
  52. NumWriter1<0>::write();
  53.  
  54. NumWriter2<0, 1>::write();
  55. NumWriter2<0, 234>::write();
  56. NumWriter2<2, 56>::write();
  57. NumWriter2<2, 0>::write();
  58. NumWriter2<0, 0>::write();
  59. return 0;
  60. }
  61.  
Success #stdin #stdout 0s 4304KB
stdin
Standard input is empty
stdout
Передано число 10
Передан нолик
Передан нолик и число 1
Передан нолик и число 234
Переданы числа 2 и 56
Передано число 2 и нолик
Переданы два нолика