#include <iostream>
template <typename T>
class A
{
public:
A(T t) : mT(t) {}
virtual ~A() {}
virtual void doThings() = 0;
protected:
T mT;
};
template <typename T, typename A = A<T>>
class B : public A
{
public:
B(T t) : A(t) {}
virtual ~B() {}
virtual void doThings() { std::cout << "B" << std::endl; std::cout << A::mT << std::endl; }
};
template <typename T, typename A = A<T>>
class C : public A
{
public:
C(T t) : A(t) {}
virtual ~C() {}
virtual void doThings() { std::cout << "C" << std::endl; std::cout << A::mT << std::endl;}
};
template <typename... T>
void ignore(T&&... t)
{
}
template <typename T, typename ...Args>
class ChildGenerator : public Args...
{
public:
ChildGenerator(T t) : Args(t)... {}
// The unpacking of the variadic template does not work here.
// Do I need to make it recursive somehow? How can I do that without having to instantiate new classes B and C?
void doThings() override { ((Args::doThings()) , ...);}
};
int main()
{
using B = B<double>;
using C = C<double>;
B c1(0.0);
C c2(1.0);
ChildGenerator<double, B, C> c3(2.0);
c1.doThings();
c2.doThings();
c3.doThings();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmNsYXNzIEEKewpwdWJsaWM6CiAgICBBKFQgdCkgOiBtVCh0KSB7fQogICAgdmlydHVhbCB+QSgpIHt9CiAgICB2aXJ0dWFsIHZvaWQgZG9UaGluZ3MoKSA9IDA7CnByb3RlY3RlZDoKICAgIFQgbVQ7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQSA9IEE8VD4+CmNsYXNzIEIgOiBwdWJsaWMgQQp7CnB1YmxpYzoKICAgIEIoVCB0KSA6IEEodCkge30KICAgIHZpcnR1YWwgfkIoKSB7fQogICAgdmlydHVhbCB2b2lkIGRvVGhpbmdzKCkgeyBzdGQ6OmNvdXQgPDwgIkIiIDw8IHN0ZDo6ZW5kbDsgc3RkOjpjb3V0IDw8IEE6Om1UIDw8IHN0ZDo6ZW5kbDsgfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEEgPSBBPFQ+PgpjbGFzcyBDIDogcHVibGljIEEKewpwdWJsaWM6CiAgICBDKFQgdCkgOiBBKHQpIHt9CiAgICB2aXJ0dWFsIH5DKCkge30KICAgIHZpcnR1YWwgdm9pZCBkb1RoaW5ncygpIHsgc3RkOjpjb3V0IDw8ICJDIiA8PCBzdGQ6OmVuZGw7IHN0ZDo6Y291dCA8PCBBOjptVCA8PCBzdGQ6OmVuZGw7fQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFQ+CnZvaWQgaWdub3JlKFQmJi4uLiB0KQp7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSAuLi5BcmdzPgpjbGFzcyBDaGlsZEdlbmVyYXRvciA6IHB1YmxpYyBBcmdzLi4uCnsKcHVibGljOgogICAgQ2hpbGRHZW5lcmF0b3IoVCB0KSA6IEFyZ3ModCkuLi4ge30KCiAgICAvLyBUaGUgdW5wYWNraW5nIG9mIHRoZSB2YXJpYWRpYyB0ZW1wbGF0ZSBkb2VzIG5vdCB3b3JrIGhlcmUuCiAgICAvLyBEbyBJIG5lZWQgdG8gbWFrZSBpdCByZWN1cnNpdmUgc29tZWhvdz8gSG93IGNhbiBJIGRvIHRoYXQgd2l0aG91dCBoYXZpbmcgdG8gaW5zdGFudGlhdGUgbmV3IGNsYXNzZXMgQiBhbmQgQz8KICAgIHZvaWQgZG9UaGluZ3MoKSBvdmVycmlkZSB7ICgoQXJnczo6ZG9UaGluZ3MoKSkgLCAuLi4pO30KfTsKCmludCBtYWluKCkKewogICAgdXNpbmcgQiA9IEI8ZG91YmxlPjsKICAgIHVzaW5nIEMgPSBDPGRvdWJsZT47CiAgICBCIGMxKDAuMCk7CiAgICBDIGMyKDEuMCk7CiAgICBDaGlsZEdlbmVyYXRvcjxkb3VibGUsIEIsIEM+IGMzKDIuMCk7CiAgICBjMS5kb1RoaW5ncygpOwogICAgYzIuZG9UaGluZ3MoKTsKICAgIGMzLmRvVGhpbmdzKCk7CiB9