[英]C++ - Pushing variadic template class object into vector
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
class、 class A
和 class B
。
A
和B
繼承自Base
。 Foo
類是一個模板類,它帶有一個可變參數模板。 這個想法是能夠將A
類和B
類傳遞給Foo
。 然后這個Foo
在Registry
類中Registry
/推送到一個向量中。
問題如下 - 如您所見,我可以同時擁有Foo<A>
和Foo<A, B>
或Foo<B, A>
。 我怎么能有這樣一個可以接受所有可能類型的Foo
的向量?
一個簡單的公共基類怎么樣?
class FooBase {
public:
virtual ~FooBase() {}
virtual void test() = 0;
};
template<typename... T>
class Foo : public FooBase, public T...
{
public:
Foo() { }
void test() override { (T::foo(), ...); }
};
int main()
{
auto f1 = std::make_unique<Foo<A, B>>();
auto f2 = std::make_unique<Foo<A>>();
std::vector<std::unique_ptr<FooBase>> foos;
foos.push_back(std::move(f1));
foos.push_back(std::move(f2));
}
std::vector
包含一種類型的對象。 您不能將不同類型的對象放入同一個向量中(並且從具有不同模板參數的模板創建的對象是不同的類型)。
一種選擇(我不推薦它)是擁有一個包含std::any
實例的向量 - 有效,但使用起來很麻煩且效率低下。 另一種選擇是指向公共基類並利用多態性的指針向量。 第三種選擇是簡單地為每種類型的對象使用單獨的向量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.