将任何对象类型传递给函数C ++

时间:2015-02-07 01:51:45

标签: c++ boost

我正在使用提供不同类型信号对象的库。 该库有一个方法:

void sendSignal(boost::shared_ptr<ISignal>)

库提供的每个Signal对象都实现了ISignal接口。 ISignal接口不提供任何克隆方法。但是,实现ISignal的所有对象都有一个复制构造函数。

我想创建一个函数,它接受任何实现ISignal的类型,通过调用复制构造函数克隆该对象,并返回新复制的对象。我想在不同的复制对象上多次调用sendSignal。

代码当前在多个位置调用不同对象的复制构造函数。我希望有一种简单的方法可能将模板传递给函数,并让该函数通过假设该对象具有复制构造函数来复制该对象。 但是,我的问题是我无法通过ISignal,因为它没有指定任何复制构造函数,并且我无法传递实现ISignal的特定对象。 有没有办法可以做到这一点,没有C ++ 11?

2 个答案:

答案 0 :(得分:3)

template<class XSignal,
  class=typename std::enable_if<
    std::is_base_of<ISignal,XSignal>::value
  >::type
>
std::shared_ptr<XSignal> CopySignal( XSignal const& signal ) {
  return std::make_shared<XSignal>(signal);
}

是一个函数,可以接受从ISignal派生的任何类的实例,并生成共享指针副本。

您必须在编译时知道实际的派生类型才能使用此函数。

答案 1 :(得分:0)

基类的复制构造函数无法复制基类所属的整个派生对象。这适用于C ++或C ++ 11。这是C ++的基础。

基类必须定义虚拟clone()方法或类似名称的东西,并且每个派生类必须重写clone()以在堆上构造派生类的另一个实例,然后返回指向它的指针。这是用C ++实现这一目的的唯一可移植方式。

如果基类至少有一个虚方法,那么你可以自己编写一个clone()的外部实现,该实现尝试dynamic_cast到基类的每个可能的派生类,并且,如果成功,则实现派生的特定于类的对象副本。