質問の要約のベストショットは次のとおりです。
複数の個別のクラスが複数の個別の基本クラスからそれぞれを継承する場合、継承機構を使用して、これらの複数の基本クラスからオブジェクトをパラメーターとして受け取る関数を作成するにはどうすればよいですか?
しかし、例で説明する方が良いでしょう。
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
これまでの私の最善の解決策は、クラスの 1 つを 2 回テンプレート化することです。
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
類似しています。質問にもPCLタグを追加しました。A
Keypoint
B
#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
}