这是我最好的问题摘要:
当多个单独的类从多个单独的基类中继承每个类时,如何使用继承机制编写一个函数,该函数将来自多个这些基类的对象作为参数?
但最好通过例子来解释。
我有一个在其 API 中提供以下类的库:
class A{..};
class B{..};
这些类用于向使用应用程序隐藏模板的复杂性。实现涉及模板:
template <Type1>
class AImpl: public A{..};
template <Type2>
class BImpl: public B{..};
问题是我需要一个类似的功能:
void foo(A insta,B instb);
继承机制在这里似乎对我没有多大帮助,因为如果函数在内部AImpl
,它就无法自动选择正确Type2
的BImpl
(没有动态转换列表)。
到目前为止,我最好的解决方案是将其中一个类模板化两次:
template <Type1,Type2>
class BImpl: public B{
void foo(A insta);
};
但是这种方法似乎并没有扩展到组合A
和B
几个任意模板化实例化可能有用的情况(这需要一个动态转换,它只在确定参数insta
实际上是一个AImpl<Type2>
- 或上述列表的情况下才有效演员表)。
在不增加A
and用户的复杂性的情况下B
,是否可以做我在这里尝试做的事情,还是有更惯用的方法?
谢谢大家。
编辑
鉴于 Bart van Ingen Schenau 的回答,这可能无关紧要,但为了回应 Nawaz 和 Andy Prowl 的询问,我制定了以下示例文件。它需要 PCL 库,但它是工作代码(尽管我试图实现的一个缩减示例)。
感谢大家的意见。
该类Features
类似于A
上面和Keypoint
上面B
。我也将 PCL 标签添加到问题中。
#include <pcl/features/fpfh.h> //gives pcl::PointCloud, pcl::FPFHSignature33, etc.
//interface
class Keypoints{
public:
virtual unsigned int size();
//more virtual methods here
};
class Features{
public:
virtual unsigned int size();
//more virtual methods here
};
//implementation
template<typename KeypointType>
class KeypointsImpl:public Keypoints{
public:
typename pcl::PointCloud<KeypointType>::Ptr keypoints_;
virtual unsigned int size(){ return keypoints_->size();}
//more implementations of virtual methods here
};
template<typename FeatureType>
class FeaturesImpl:public Features{
public:
typename pcl::PointCloud<FeatureType>::Ptr features_;
virtual unsigned int size(){ return features_->size();}
//more implementations of virtual methods here
};
//void removeBadFeatures(Keypoints k,Features f); //<-- would like to have this too
int
main (int argc, char ** argv)
{
//Class construction could be done anywhere.
Features *f = new FeaturesImpl<pcl::FPFHSignature33>();
Keypoints *k = new KeypointsImpl<pcl::PointXYZ>();
int a = f->size();
int b = k->size();
//removeBadFeatures(k,f); //will alter f and k in concert
}