0

私は次のようにC++で不透明なオブジェクトを作成する方法を知っています:

// my_class.hpp
class opaque_object;
class my_class {
    my_class();
    ~my_class();
    opaque_object *m_opaque_object;
};

// my_class.cpp
#include <my_class.hpp>
class opaque_object {
    // ...
};
my_class::my_class() { m_opaque_object = new opaque_object(); }
my_class::~my_class() {delete m_opaque_object; }

次に、不透明なオブジェクトが、この名前空間のヘッダーファイルを含めずに、別の名前空間にある既存のクラステンプレートである場合にそれを行う方法を説明します。次のコードは良くありません、それは私の問題を説明するためにここにあります。

// my_class.hpp
class third::party::library::opaque_object<
    third::party::library::templated_class>;

class my_class {
    my_class();
    ~my_class();
    third::party::library::opaque_object<
        third::party::library::templated_class> *m_opaque_object;
};

// my_class.cpp
#include <my_class.hpp>
#include <third/party/library/opaque_object.hpp>
#include <third/party/library/template_class.hpp>

typedef third::party::library::opaque_object<
    third::party::library::templated_class> opaque_object;

my_class::my_class() { m_opaque_object = new opaque_object(); }
my_class::~my_class() {delete m_opaque_object; }

私のソースコードの実際のクラスは、この例よりもさらにテンプレート化されています(templateの4つの引数と、それ自体がテンプレート化されたクラスであるものもあります)。

my_class.hppは私のプロジェクトのどこでも使用されているため、一般的なコンパイルには多くの時間がかかります(各cppファイルにmy_class.hppを含めるのに5秒かかります)。したがって、opaque_object.hpp、template_class.hpp ... my_class.hppにあります。

これはどのように行うことができますか?コメントやアイデアは大歓迎です。よろしくお願いします。

4

2 に答える 2

0

テンプレートテンプレートパラメータにしてみませんか(さらにパラメータが必要かどうかはわかりません:)

template <typename T, template <class> typename opaque>
class my_class
{
...
    opaque<T>* opaque_;
};
于 2010-02-02T15:08:11.400 に答える
0

テンプレート化された各クラスと、テンプレート(テンプレート引数)に必要な各クラスを適切な名前空間で宣言する必要があります。

于 2010-05-17T06:30:43.607 に答える