2

我想将任何类型的对象(对象、对象等)放入一个 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;
};
4

2 回答 2

3

你不能。这样的声明应该如何看待,它可以返回各种类型?这是不可能的。您必须将其ObjectBase*转换为正确的Object<T>*,然后使用该getMember功能。只有当所有人T共享一个公共基类时才有可能,因此您可以返回一个指向该基类的指针。但这会对T.

于 2011-03-28T10:15:13.110 回答
0

那是做不到的。编译器必须预先知道有多少不同的虚拟函数(和重载)可用,但在您的情况下,您正在考虑根据派生类型的新潜在实例化按需添加新的虚拟成员函数。

在大多数情况下,将完全不相关的对象保存在同一个容器中并不是一个好的设计选项,但对于少数实际情况,您可以使用变体类型(考虑 boost::any 或 boost::variant,具体取决于您的实际情况)这是一个捆绑的、经过测试的变体类型的实现,您可以直接使用它。

于 2011-03-28T10:29:34.910 回答