以下是我对问题摘要的最佳镜头:
当多个单独的类从多个单独的基类继承时 类,如何使用继承机制编写函数 将来自多个这些基类的对象作为参数?
但最好通过例子来解释。
我有一个库,在其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
和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
}
答案 0 :(得分:1)
如果我理解正确,您正在编写一个使用多个独立模板的库(Aimpl
,Bimpl
等)。要从库的用户隐藏此事实,您只公开这些模板的非模板基类(A
,B
等)。
现在,你有一个函数foo
需要对两个模板化类型进行工作,作为对它们的基类的引用传入,你面临的问题是你不能(轻易地)推导出哪些模板参数参考。
解决这个难题只有几个选择:
foo
(因为这是foo
所拥有的所有信息。)dynamic_cast
的无限列表以确定您正在使用的派生类。 (如果以任何可能的方式,最好避免使用此选项,因为这是一场真正的噩梦。)