函数参数可以多次输入吗?

时间:2016-01-29 07:26:21

标签: c++ function class

我很确定答案是否定的,但由于它很可爱,我还是会问这个问题。

示例:

class Serializable
{
public:

  virtual void serialize() = 0;
};

class Unserializable
{
public:

  virtual void unserialize() = 0;
};

class A : public Serializable
{
public:

  virtual void serialize()
  {
  }
};

class B : public A, public Unserializable
{
public:

  virtual void unserialize()
  {
  }
};

现在,有没有办法创建一个函数,其中一个参数是两个 Serializable 的实例和 Unserializable,这样就可以传递B类的对象(当然,没有引用派生类型B)?类似的东西:

void readAndWrite(Serializable_Unserializable& object);

3 个答案:

答案 0 :(得分:3)

当然,如果您可以修改B(以及必须继承这两者的任何其他派生类型)来派生一个继承两个接口的接口,并且不介意虚拟继承:

class Serializable_Unserializable:
    public virtual Serializable,
    public virtual Unserializable

还必须将虚拟继承添加到A以及继承两个基本接口之一的任何其他类,并且可以由也继承组合接口的类继承。

class A: public virtual Serializable

现在,您可以将B更改为:

class B: public A, public Serializable_Unserializable

它可以传递给您的void readAndWrite(Serializable_Unserializable& object)

如果没有这些更改,我不认为您可以定义一个函数,它只接受继承两个独立接口的对象,但允许在运行时确定类型。如果后者不是硬性要求,那么模板将是另一种选择。

答案 1 :(得分:3)

模板方式:

template <typename T>
std::enable_if_t<std::is_base_of<Serializable, T>::value
              && std::is_base_of<Unserializable, T>::value>
void readAndWrite(T& object)

答案 2 :(得分:1)

如果您不介意搜索对象的VMT以查看是否支持dynamic_cast,则可以考虑使用Unserializable

void readAndWrite(Serializable& object)
{
    Unserializable *uobject = dynamic_cast<Unserializable*>(&object);
    if (uobject) {
        // supported ...
    } else {
        // not supported ...
    }
}