我想将任何类型的Object(Object,Object等)放入一个shared_ptr中。所以我创建了基类并使用了shared_ptr。
但是,我怎么能宣布
T getMember();
在基类中,所以我可以调用ObjectBase.getMember?
class ObjectBase
{
public:
//virtual getMember HOWTO?
};
template<typename T>
class Object : public ObjectBase
{
public:
Object(T x):member(x) { }
T getMember() { return member; }
private:
T member;
};
答案 0 :(得分:3)
你做不到。这样的宣言怎么看,它可以归还各种类型?这是不可能的。您必须将ObjectBase*
转换为正确的Object<T>*
,然后使用getMember
函数。只有当所有T
共享一个公共基类时才有可能,所以你可以返回指向它的指针。但这会严格限制T
。
答案 1 :(得分:0)
无法做到。编译器必须事先知道有多少不同的虚函数(和重载)可用,但在您的情况下,您正在考虑根据派生类型的新潜在实例化按需添加新的虚拟成员函数。
在大多数情况下,将完全不相关的对象保存在同一容器中并不是一个好的设计选项,但对于实际情况很少的情况,可以使用变量类型(考虑boost :: any或boost :: variant,具体取决于根据您的实际要求。这是您可以直接使用的变体类型的捆绑测试实现。