有一个模板化的类,让它成为
template<typename T> class A { std::vector<T> data; };
我在这里面临的问题是,用户可以创建此类的几种类型,但是我需要对其进行跟踪,最好的情况是我在另一个向量中引用了这些对象,但是由于所有类型都是不同。 您能推荐一个好的设计模式来封装它吗?
我可以存储指针,然后进行类型转换,但它并不优雅。
如果提供的解决方案足够好,我也可以更改体系结构。 我要解决的基本问题是,我有一类自定义类型的向量,如何存储它们。
答案 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>::data
和A<double>::data
向量。