-4

这是我最好的问题摘要:

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

但最好通过例子来解释。

我有一个在其 API 中提供以下类的库:

class A{..};

class B{..};

这些类用于向使用应用程序隐藏模板的复杂性。实现涉及模板:

template <Type1>
class AImpl: public A{..};

template <Type2>
class BImpl: public B{..};

问题是我需要一个类似的功能:

void foo(A insta,B instb);

继承机制在这里似乎对我没有多大帮助,因为如果函数在内部AImpl,它就无法自动选择正确Type2BImpl(没有动态转换列表)。

到目前为止,我最好的解决方案是将其中一个类模板化两次:

template <Type1,Type2>
class BImpl: public B{
  void foo(A insta);
};

但是这种方法似乎并没有扩展到组合AB几个任意模板化实例化可能有用的情况(这需要一个动态转换,它只在确定参数insta实际上是一个AImpl<Type2>- 或上述列表的情况下才有效演员表)。

在不增加Aand用户的复杂性的情况下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
}
4

1 回答 1

1

如果我理解正确,您正在编写一个使用多个独立模板(Aimpl、、Bimpl等)的库。为了对库的用户隐藏这一事实,您只公开这些模板的非模板基类(AB等)。
现在,您有一个函数foo需要处理两个模板化类型,作为对其基类的引用传入,并且您面临无法(轻松)推断出参数引用的模板的问题。

只有几个选项可以解决这个困境:

  1. 完全根据在基类上工作的操作来编写foo(因为这就是所有的信息foo)。
  2. 认真地重新考虑使用继承隐藏模板的优点您的库设计。
  3. Write the interminable list of dynamic_casts to determine which derive class you are working with. (it is best to avoid this option if in any way possible, because it is a real nightmare.)
于 2013-01-20T15:51:36.827 回答