簡體   English   中英

C++ - 將可變參數模板類對象推入向量中

[英]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

AB繼承自Base Foo類是一個模板類,它帶有一個可變參數模板。 這個想法是能夠將A類和B類傳遞給Foo 然后這個FooRegistry類中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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM