【发布时间】:2020-05-22 21:35:33
【问题描述】:
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。
Foo 类是一个模板类,它带有可变参数模板。
这个想法是能够将A 和B 类传递到Foo。
然后这个Foo注册在Registry类中/推入一个向量中。
问题如下 - 如您所见,我可以同时拥有 Foo<A> 和 Foo<A, B>,或 Foo<B, A>。
我怎样才能有一个可以接受所有可能类型的Foo的向量?
【问题讨论】:
-
如果你想要一个具有通用基类的类容器,那么 Boost.PolyCollection 可能是不错的候选者:boost.org/doc/libs/1_72_0/doc/html/poly_collection.html
标签: c++ templates variadic-templates multiple-inheritance