将模板对象存储在向量中(将Class <int>,Class <double>存储在单个向量中)

时间:2019-01-31 06:49:33

标签: c++ oop design-patterns stdvector

有一个模板化的类,让它成为

template<typename T> class A { std::vector<T> data; };

我在这里面临的问题是,用户可以创建此类的几种类型,但是我需要对其进行跟踪,最好的情况是我在另一个向量中引用了这些对象,但是由于所有类型都是不同。 您能推荐一个好的设计模式来封装它吗?

我可以存储指针,然后进行类型转换,但它并不优雅。

如果提供的解决方案足够好,我也可以更改体系结构。 我要解决的基本问题是,我有一类自定义类型的向量,如何存储它们。

2 个答案:

答案 0 :(得分:1)

如先前的评论所述-您首先需要确保这是您所需要的。

话虽如此,我在我的一个项目中也有类似的要求,最终我通过继承和PIMPL解决了如下问题:

class A{
private:
    struct Abstract {
        virtual void f() = 0;
    };

    template <typename T>
    struct Implementation : public Abstract {
        std::vector<T> data;
        virtual void f() {...}
    };

    std::unique_ptr<Abstract> impl;

public:
    template <typename T>
    A(): impl(std::make_unique<Implementation<T> >()){}

    void f() {impl->f();}
};

这使您可以创建一个对象类型为“ A”的容器,并通过其中定义的公共接口(方法“ f”)对其进行访问。每个“ A”对象的基础类型“ T”在构造时指定。所有其他特定于类型“ T”的实现细节都被隐藏了。

该解决方案承受了虚拟功能的固有开销。我不确定它与std :: any方法在性能方面的比较。

答案 1 :(得分:0)

std::any是现代的c ++ 17解决方案。具体来说,您应该使用

A<int> a;
a.data.push_back(0);

// fill refernces...
std::vector<std::any> refernces; 
refernces.push_back(&a.data[0]);

// check which type is active.
if(int** iPtr = std::any_cast<int*>(&references[0]); iPtr != nullptr)
{
     // its an int*
     int& i = **iPtr;
     // do something with i.
}

这些指针可以指向A<int>::dataA<double>::data向量。

有关完整参考,请参见https://en.cppreference.com/w/cpp/utility/any