#include <iostream>
#include <utility>
template<class T>
class IQueue
{
protected:
T Data[10];
public:
virtual const T pop() = 0;
virtual void push(const T&) = 0;
};
template<class T>
class QueueA : public IQueue<T>
{
public:
const T pop() final {
std::cout << "pop queue A" << std::endl;
return T{};
}
void push(const T& aItemRef) final {
std::cout << "PUSH queue A" << std::endl;
}
};
template<class T>
class QueueB : public IQueue<T>
{
public:
const T pop() final {
std::cout << "pop queue B" << std::endl;
return T{};
}
void push(const T& aItemRef) final {
std::cout << "PUSH queue B" << std::endl;
}
};
template<class T>
void test_push_pop(IQueue<T>& aQueueP)
{
aQueueP.push(T{});
aQueueP.pop();
}
void test_push_pops()
{
}
template<class T, class... Ts>
void test_push_pops(T&& aQueueP, Ts&&... aQueuePs)
{
test_push_pop(std::forward<T>(aQueueP));
test_push_pops(aQueuePs...);
};
template<class ... Ts>
void tester_queues(Ts&&... args)
{
test_push_pops(args...);
};
int main()
{
tester_queues( QueueA<int>{}, QueueB<char>{} );
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KIAp0ZW1wbGF0ZTxjbGFzcyBUPgpjbGFzcyBJUXVldWUKewpwcm90ZWN0ZWQ6CiAgICBUIERhdGFbMTBdOwpwdWJsaWM6CiAgICB2aXJ0dWFsIGNvbnN0IFQgcG9wKCkgICAgICAgICAgPSAwOwogICAgdmlydHVhbCB2b2lkICAgIHB1c2goY29uc3QgVCYpID0gMDsKfTsKCnRlbXBsYXRlPGNsYXNzIFQ+CmNsYXNzIFF1ZXVlQSA6IHB1YmxpYyBJUXVldWU8VD4KewpwdWJsaWM6Cgljb25zdCBUIHBvcCgpIGZpbmFsIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgInBvcCBxdWV1ZSBBIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgcmV0dXJuIFR7fTsKICAgIH0KCiAgICB2b2lkIHB1c2goY29uc3QgVCYgYUl0ZW1SZWYpIGZpbmFsIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIlBVU0ggcXVldWUgQSIgPDwgc3RkOjplbmRsOwogICAgfQp9OwoKdGVtcGxhdGU8Y2xhc3MgVD4KY2xhc3MgUXVldWVCIDogcHVibGljIElRdWV1ZTxUPgp7CnB1YmxpYzoKCWNvbnN0IFQgcG9wKCkgZmluYWwgewogICAgICAgIHN0ZDo6Y291dCA8PCAicG9wIHF1ZXVlIEIiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICByZXR1cm4gVHt9OwogICAgfQoKICAgIHZvaWQgcHVzaChjb25zdCBUJiBhSXRlbVJlZikgZmluYWwgewogICAgICAgIHN0ZDo6Y291dCA8PCAiUFVTSCBxdWV1ZSBCIiA8PCBzdGQ6OmVuZGw7CiAgICB9Cn07Cgp0ZW1wbGF0ZTxjbGFzcyBUPgp2b2lkIHRlc3RfcHVzaF9wb3AoSVF1ZXVlPFQ+JiBhUXVldWVQKQp7CglhUXVldWVQLnB1c2goVHt9KTsKICAgIGFRdWV1ZVAucG9wKCk7Cn0KCnZvaWQgdGVzdF9wdXNoX3BvcHMoKQp7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzLi4uIFRzPgp2b2lkIHRlc3RfcHVzaF9wb3BzKFQmJiBhUXVldWVQLCBUcyYmLi4uIGFRdWV1ZVBzKQp7Cgl0ZXN0X3B1c2hfcG9wKHN0ZDo6Zm9yd2FyZDxUPihhUXVldWVQKSk7Cgl0ZXN0X3B1c2hfcG9wcyhhUXVldWVQcy4uLik7Cn07Cgp0ZW1wbGF0ZTxjbGFzcyAuLi4gVHM+CnZvaWQgdGVzdGVyX3F1ZXVlcyhUcyYmLi4uIGFyZ3MpCnsKCXRlc3RfcHVzaF9wb3BzKGFyZ3MuLi4pOwp9OwoKaW50IG1haW4oKQp7CiAgICB0ZXN0ZXJfcXVldWVzKCBRdWV1ZUE8aW50Pnt9LCBRdWV1ZUI8Y2hhcj57fSApOwogICAgcmV0dXJuIDA7Cn0=