class Base
{
public:
virtual void foo() = 0;
};
class A : public Base
{
public:
void foo() override { std::cout << "A\n"; }
};
class B : public Base
{
public:
void foo() override { std::cout << "B\n"; }
};
class Registry
{
public:
static Registry& instance()
{
static Registry s_instance;
return s_instance;
}
void register_foo(Base* foo)
{
m_vec.emplace_back(foo);
}
private:
std::vector<Base*> m_vec;
};
template<typename ... T>
class Foo : public T...
{
public:
Foo()
{
Registry::instance().register_foo(this);
}
void test() { (T::foo(), ...); }
};
int main()
{
auto f1 = std::make_unique<Foo<A, B>>();
auto f2 = std::make_unique<Foo<A>>();
f1->test();
f2->test();
}
Как видите, класс Base
, класс A
и класс B
.
A
и B
наследуются от Base
. Class Foo
- это шаблонный класс, который имеет шаблон variadi c. Идея состоит в том, чтобы иметь возможность передать класс A
и класс B
в Foo
. Затем этот Foo
регистрируется в классе Registry
/ помещается в вектор.
Проблема заключается в следующем - как вы можете видеть, у меня могут быть и Foo<A>
, и Foo<A, B>
, или * 1020. *. Как я могу иметь такой вектор, который может принимать все возможные типы Foo
?