fork(10) download
  1. #include <iostream>
  2.  
  3. struct DynamicSize {};
  4.  
  5. enum class SIZE_RANGE {SMALL, MEDIUM = 10, BIG = 100};
  6. constexpr bool operator<(int size, SIZE_RANGE s) {
  7. return size < (int)s;
  8. }
  9.  
  10. //-------------------------------------------------------------------------
  11. // FixedSize manages its own range selection here
  12. template<int Size,
  13. SIZE_RANGE SizeRange = (Size < SIZE_RANGE::MEDIUM? SIZE_RANGE::SMALL :
  14. Size < SIZE_RANGE::BIG? SIZE_RANGE::MEDIUM :
  15. SIZE_RANGE::BIG)>
  16. struct FixedSize {};
  17. //-------------------------------------------------------------------------
  18.  
  19. template<class T, class Size>
  20. class Container;
  21.  
  22. template<class T>
  23. class Container<T, FixedSize<0>> {
  24. public:
  25. Container() { std::cout << "Special case of FixedSize 0\n"; }
  26. };
  27.  
  28. template<class T, int size>
  29. class Container<T, FixedSize<size, SIZE_RANGE::SMALL>> {
  30. public:
  31. Container() { std::cout << "Small FixedSize: " << size << "\n"; }
  32. };
  33.  
  34. template<class T, int size>
  35. class Container<T, FixedSize<size, SIZE_RANGE::MEDIUM>> {
  36. public:
  37. Container() { std::cout << "Medium FixedSize: " << size << "\n"; }
  38. };
  39.  
  40. template<class T, int size>
  41. class Container<T, FixedSize<size, SIZE_RANGE::BIG>> {
  42. public:
  43. Container() { std::cout << "Big FixedSize: " << size << "\n"; }
  44. };
  45.  
  46. template<class T>
  47. class Container<T, DynamicSize> {
  48. public:
  49. Container() { std::cout << "dynamic size\n"; }
  50. };
  51.  
  52. int main() {
  53. Container<char, DynamicSize> a;
  54. Container<char, FixedSize<0>> b;
  55. Container<char, FixedSize<5>> c;
  56. Container<char, FixedSize<42>> d;
  57. Container<char, FixedSize<100>> e;
  58. }
Success #stdin #stdout 0s 3456KB
stdin
Standard input is empty
stdout
dynamic size
Special case of FixedSize 0
Small FixedSize: 5
Medium FixedSize: 42
Big FixedSize: 100