使用继承来重定向多个并行层次结构C ++

时间:2013-01-20 15:24:11

标签: c++ templates inheritance point-cloud-library

以下是我对问题摘要的最佳镜头:

  

当多个单独的类从多个单独的基类继承时   类,如何使用继承机制编写函数   将来自多个这些基类的对象作为参数?

但最好通过例子来解释。

我有一个库,在其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);
};

但是这种方法似乎并没有扩展到将AB与几个任意模板化的实例化结合起来可能有用的情况(这需要一个只能在它所用的地方运行的动态强制转换)确保参数insta实际上是AImpl<Type2> - 或前面提到的演员表。

如果不为AB的用户增加复杂性,是否可以执行我在此处尝试的操作,或者是否有更惯用的方法?

感谢所有人。

修改

根据Bart van Ingen Schenau的回答,这可能无关紧要,但是为了回应Nawaz和Andy Prowl的询问,我制定了以下示例文件。它需要PCL库,但它是工作代码(虽然是我想要实现的一个简化示例)。

感谢大家的意见。

课程Features类似于上面的A和上面的KeypointB。我也在问题中添加了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
}

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您正在编写一个使用多个独立模板的库(AimplBimpl等)。要从库的用户隐藏此事实,您只公开这些模板的非模板基类(AB等)。
现在,你有一个函数foo需要对两个模板化类型进行工作,作为对它们的基类的引用传入,你面临的问题是你不能(轻易地)推导出哪些模板参数参考。

解决这个难题只有几个选择:

  1. 完全根据处理基类的操作写foo(因为这是foo所拥有的所有信息。)
  2. 严肃地重新考虑您的库设计,使用继承来隐藏模板。
  3. 编写dynamic_cast的无限列表以确定您正在使用的派生类。 (如果以任何可能的方式,最好避免使用此选项,因为这是一场真正的噩梦。)