4

プロジェクトでブーストptreeを使用したいのですが、ptree.hppによって約1000個のヘッダーファイルがインクルードされるため、コンパイル時間が大幅に増加し(たとえば、1秒から7秒)、20を超える異なるcppファイルで必要になるため、これはそうではありません。許容範囲内(プリコンパイル済みヘッダーはあまり改善されません)。だから私は自分のクラスにブーストptreeをカプセル化することを考えています

// myptree.h
#include <boost/property_tree/ptree_fwd.hpp>

class myptree {
   private:
      boost::property_tree::ptree *m_tree;

   public:
      ...
     // adding new (single value) members to the the tree
     void put(const std::string&, double);
     void put(const std::string&, int);
     void put(const std::string&, const std::string&);

     // returning (single value) members of the tree
     double get_double(const std::string&) const;
     int get_int(const std::string&) const;
     std::string get_str(const std::string&) const;

     // working with subtrees
     void push_back(const std::string&, const myptree&);
     myptree get_child(const std::string&) const;

     // import/export
     void read_from_json(const std::string&);
     void write_to_json(const std::string&) const;

};

しかし、私はイテレータをうまく実装できていません。理想的には、boost::property_tree::ptree::iteratorをプライベートメンバー変数としてm_tree使用し、それを自分のメンバー関数を使用して繰り返すことができるようにしたいのですが、内部クラスを前方宣言するにはどうすればよいですか?これは一般的に不可能です。このクラス内にイテレータを実装するエレガントな方法はありますか?

4

3 に答える 3

4

あなたの問題は、 Pimplイディオム、別名コンパイラファイアウォール、別名Handle-Bodyの良い候補です。この記事も参照してください。あなたが提案している解決策は、そのイディオムによく似ています。

ptreeのイテレータをクライアントから隠すには、この記事any_iteratorで紹介する手法を確認してください。

any_iterator ここここの実装を見つけることができます。

于 2011-05-12T00:39:33.680 に答える
3

実際の質問に対する適切な回答はありませんが、その場合、プリコンパイルされたヘッダーは大幅に改善されるはずです。それが実際に使用されていて、ヘッダーがまだ各コンパイル単位から読み取られていなかったと確信していますか? 最適に設定するのは少し難しいかもしれません。(つまり、「自動」オプションは避けてください)

于 2011-05-11T22:11:28.813 に答える
0

回答ありがとうございます。プリコンパイル済みヘッダーについては、実際に使用されていることを確認しました (g++ -H最初は約 1460 個のヘッダー ファイルが表示され、プリコンパイル済みヘッダーを使用する場合は約 30 個しか表示されません)。コンパイル時間は 7 秒から 5.5 秒に短縮されました。上記のカプセル化されたクラス。

今、私が使用しようとしたときany_iterator(これは現在ブーストの一部でもあるようです)、数百の他のヘッダーファイルも追加されていることに気付きましたが、単にそれらを含めるだけではコンパイル時間はそれほど増加しませんでした. そこで、ptree ヘッダーで同じことを試し、ptree.hpp代わりにptree_fwd.hppand をインクルードすると、コンパイル時間が少しだけ増加しました (1.1 秒から 1.8 秒)。ptree テンプレートがインスタンス化されている場合にのみ、コンパイル時間の大幅なペナルティが発生するようです。プリコンパイル済みヘッダーがそれほど役に立たなかった理由も説明できますか? 怠け者で、私の主な問題はコンパイル時間だったので、次のようなものに固執するかもしれません:

// myptree.h
#include <boost/property_tree/ptree.hpp>

class myptree {
   private:
      boost::property_tree::ptree           m_tree;
      boost::property_tree::ptree::iterator m_it;
   ...
};
于 2011-05-12T12:14:29.637 に答える