2

クラス「goody」を実装し、次の構造を持つ親パッケージがあります。

parent/include/goody.h
parent/src/goody.cpp

このパッケージは、構造を持つ複数の子パッケージ child_1 から child_n で使用されます

child_i/include/child_details.h
child_i/src/main.cpp

ここで、main.cpp は「goody」を使用します。重要な部分は、child_details.h が「goody」の実装に必要な情報を親に提供することです。goody.h は次のようになります。

#include "child_details.h"
class goody
{
  double arr_[child_details::num_elements];
}

ここで、「num_elements」は定数であり、コンパイル時に知る必要があります。

テンプレートがこの種の問題に使用するのに適した構造であることはわかっていますが、(a) すべての child_i パッケージに特殊化を追加したくなく、(b) 'num_elements' が親パッケージのいたるところにあります多くのテンプレート固有のコードが必要になりますが、これは避けたいと思います。

したがって、私の質問は次のとおりです。私のパッケージを CMake で整理するためのクリーンな方法は何ですか? 子ごとに 'goody' のインスタンスが存在するため、parent 内で親パッケージをコンパイルできません。一方、親は子について知る必要がないため、親の内部でこれらのインスタンスをすべてコンパイルすることは避けたいと思います。親パッケージ内で生成できるコンパイルされていないオブジェクトのようなものはありますか?それを各子パッケージでコンパイルする必要がありますか?

4

1 に答える 1

1

goody.hは の一部であるため、parent含めないでくださいchild_details.h。代わりにテンプレートを使用することもできますが、子プロパティに依存するものを除くすべてを実装goody_childする非テンプレートオブジェクトを使用することもできます。goody_base子プロパティは、 によって実装される仮想関数を通じて知ることができますgoody_child

class goody_base {
public:
    //...
    virtual double * arr () = 0;
    virtual size_t num_elements () const = 0;
    //...
    void print_arr () {
        for (size_t i = 0; i < num_elements(); ++i) {
            std::cout << arr()[i] << std::endl;
        }
    }
    //...
};

template <typename DETAILS>
class goody_child {
    double arr_[DETAILS::num_elements];
    //...
public:
    double * arr () { return arr_; }
    size_t num_elements () const { return DETAILS::num_elements; }
    //...
};

次に、子コードは次のようになります。

#include "goody.h"
#include "child_details.h"

typedef goody_child<child_details> goody;

コードがこのように編成されている場合、テンプレートの特殊化はありません。

于 2013-10-01T10:49:02.667 に答える