将任何对象类型传递给函数 C++
Passing any object type to a function C++
我正在使用一个提供不同类型信号对象的库。
图书馆有一个方法:
void sendSignal(boost::shared_ptr<ISignal>)
库提供的每个 Signal 对象都实现了 ISignal 接口。 ISignal 接口不提供任何克隆方法。但是,所有实现 ISignal 的对象都有一个复制构造函数。
我想创建一个函数,它采用任何实现 ISignal 的类型,通过调用复制构造函数克隆该对象,以及 returns 新复制的对象。我想在不同的复制对象上多次调用 sendSignal。
代码当前在多个位置调用不同对象的复制构造函数。我希望有一种简单的方法可以将模板传递给函数并让该函数为我复制该对象,方法是假设该对象具有复制构造函数。
但是,我的问题是我无法传递 ISignal,因为它没有指定任何复制构造函数,而且我无法传递实现 ISignal 的特定对象。
如果没有 C++11,我有什么办法可以做到这一点吗?
基 class 的复制构造函数无法复制基 class 所属的整个派生对象。这适用于 C++ 或 C++11。这是 C++ 的基础。
基础 class 必须定义一个虚拟的 clone() 方法或类似名称的方法,并且每个派生的 class 必须覆盖 clone() 以构造派生的另一个实例 class 在堆上,然后 return 指向它的指针。这是在 C++ 中执行此操作的唯一可移植方法。
如果基础 class 至少有一个虚拟方法,您也许可以编写一个 clone() 的外部实现,尝试对每个可能的派生 [=] dynamic_cast
基 class 的 17=],如果成功,则实现派生的 class-特定对象副本。
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
派生的任何 class 的实例并生成共享指针副本。
您必须在编译时知道实际派生类型才能使用此函数。
我正在使用一个提供不同类型信号对象的库。 图书馆有一个方法:
void sendSignal(boost::shared_ptr<ISignal>)
库提供的每个 Signal 对象都实现了 ISignal 接口。 ISignal 接口不提供任何克隆方法。但是,所有实现 ISignal 的对象都有一个复制构造函数。
我想创建一个函数,它采用任何实现 ISignal 的类型,通过调用复制构造函数克隆该对象,以及 returns 新复制的对象。我想在不同的复制对象上多次调用 sendSignal。
代码当前在多个位置调用不同对象的复制构造函数。我希望有一种简单的方法可以将模板传递给函数并让该函数为我复制该对象,方法是假设该对象具有复制构造函数。 但是,我的问题是我无法传递 ISignal,因为它没有指定任何复制构造函数,而且我无法传递实现 ISignal 的特定对象。 如果没有 C++11,我有什么办法可以做到这一点吗?
基 class 的复制构造函数无法复制基 class 所属的整个派生对象。这适用于 C++ 或 C++11。这是 C++ 的基础。
基础 class 必须定义一个虚拟的 clone() 方法或类似名称的方法,并且每个派生的 class 必须覆盖 clone() 以构造派生的另一个实例 class 在堆上,然后 return 指向它的指针。这是在 C++ 中执行此操作的唯一可移植方法。
如果基础 class 至少有一个虚拟方法,您也许可以编写一个 clone() 的外部实现,尝试对每个可能的派生 [=] dynamic_cast
基 class 的 17=],如果成功,则实现派生的 class-特定对象副本。
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
派生的任何 class 的实例并生成共享指针副本。
您必须在编译时知道实际派生类型才能使用此函数。