fork download
  1. #include <iostream>
  2.  
  3. template<class T>
  4. class IQueue
  5. {
  6. protected:
  7. T Data[10];
  8. public:
  9. virtual const T pop() = 0;
  10. virtual void push(const T&) = 0;
  11. };
  12.  
  13. template<class T>
  14. class QueueA : public IQueue<T>
  15. {
  16. public:
  17. const T pop() final {
  18. std::cout << "pop queue A" << std::endl;
  19. return T{};
  20. }
  21.  
  22. void push(const T& aItemRef) final {
  23. std::cout << "PUSH queue A" << std::endl;
  24. }
  25. };
  26.  
  27. template<class T>
  28. class QueueB : public IQueue<T>
  29. {
  30. public:
  31. const T pop() final {
  32. std::cout << "pop queue B" << std::endl;
  33. return T{};
  34. }
  35.  
  36. void push(const T& aItemRef) final {
  37. std::cout << "PUSH queue B" << std::endl;
  38. }
  39. };
  40.  
  41. template <class... Ts>
  42. struct Tester;
  43.  
  44. template <class T, class... Ts>
  45. struct Tester<T, Ts...>
  46. {
  47. template<class U>
  48. static void test_push_pop(IQueue<U>&& aQueueP)
  49. {
  50. aQueueP.push(U{});
  51. aQueueP.pop();
  52. }
  53.  
  54. static void test_push_pops()
  55. {
  56. test_push_pop(T{});
  57. Tester<Ts...>::test_push_pops();
  58. }
  59. };
  60.  
  61. template<>
  62. struct Tester<>
  63. {
  64. static void test_push_pops() {}
  65. };
  66.  
  67. template<class... Ts>
  68. void tester_queues()
  69. {
  70. Tester<Ts...>::test_push_pops();
  71. };
  72.  
  73. int main()
  74. {
  75. tester_queues< QueueA<int>, QueueB<char> >();
  76. return 0;
  77. }
Success #stdin #stdout 0s 4248KB
stdin
Standard input is empty
stdout
PUSH queue A
pop queue A
PUSH queue B
pop queue B