-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権利Type2を自動的に選択する方法がないため、継承機構はここではあまり役に立たないようです。BImpl

これまでの私の最善の解決策は、クラスの 1 つを 2 回テンプレート化することです。

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

Aしかし、このアプローチは、いくつかの任意にテンプレート化されたインスタンス化を組み合わせて使用​​すると便利な状況には拡張されないようです(これには、パラメーターが実際に- または前述のリストBであることが確実な場合にのみ機能する動的キャストが必要です)キャストの)。instaAImpl<Type2>

Aandのユーザーに複雑さを加えることなく、Bここでやろうとしていることを実行できますか、それとももっと慣用的なアプローチがありますか?

ありがとうございます。

編集

これは Bart van Ingen Schenau の回答に照らして無関係かもしれませんが、Nawaz と Andy Prowl の質問に応えて、次のサンプル ファイルを作成しました。PCL ライブラリが必要ですが、動作するコードです (ただし、私が達成しようとしているものの縮小例です)。

ご意見をお寄せいただきありがとうございます。

このクラスは、上と上にFeatures類似しています。質問にもPCLタグを追加しました。AKeypointB

#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。この事実をライブラリのユーザーから隠すには、これらのテンプレートのテンプレート化されていない基本クラス ( 、 など) のみを公開しAますB
これで、基本クラスへの参照として渡された、テンプレート化された 2 つの型で作業する必要がある関数fooがあり、パラメーターが参照するテンプレートを (簡単に) 推測できないという問題に直面しています。

このジレンマを解決するには、いくつかのオプションしかありません。

  1. 基本クラスで機能する操作に関して完全に記述fooします (それが持つすべての情報であるためfoo)。
  2. 継承を使用してテンプレートを非表示にするメリットについて、ライブラリの設計を真剣に再考してください。
  3. s の果てしないリストを書き、dynamic_castどの派生クラスを使用しているかを判別します。(これは本当に悪夢なので、可能な限りこのオプションを避けるのが最善です。)
于 2013-01-20T15:51:36.827 に答える