2017-09-29 26 views
0

私は、すべてYAML構成ファイルを読むいくつかのC++プログラムを/etc/foo/config.ymlに持っています。私は、ファイル(yaml-cppライブラリを使用して)グローバル設定のベストプラクティス

YAML::Node load_config(); 

から設定を読み込む機能を書かれています。

私のプログラムのmain()関数の最初にこの設定をロードしてから、どこでもアクセスできるようにしたいと思います。は何らかのグローバル変数です。

現在、私の多くの機能では、余分なパラメータが設定ファイルから読み取られた値にすぎません。このグローバル設定を使用することで、関数定義と呼び出しをはるかに簡単で読みやすいものにすることができます。

サイドノート:計算を分散するためにOpenMPも使用しています。つまり、すべての並列プロセスが設定にアクセスできる必要があります。

誰かが、正しい方法でこれがどのように見えるかの小さな例を挙げることができますか?

ありがとうございます!

+1

シュワルツカウンタのアイデアのバリエーションです。あなたは、少なくともいくつかの使用例といくつかの基準を提案する必要があります。また、 'OpenMP'が何と関係しているのかはわかりません。 1つのプログラムで設定を読み込んだり、分散システム間で変更を同期させることについて話していますか? – nwp

+0

@nwpご意見ありがとうございます。私は何をやろうとしているかのように感じています(プログラム内のどこでも利用可能な設定を持つこと)は、すでに解決しているはずのかなり一般的な問題です。私には他の制約はありません。私がOpenMPを使用しているという事実に気づいたのは、ソリューションがプロセス間で構成を共有できるようにすることでした。私はそれが何かと関係しなければならないかどうか本当に分かりません。私はちょうどプログラムの開始時にファイルから設定をロードすることについて話しています、それです。再度、感謝します。 – valentin

+1

シングルトンパターンを見るかもしれませんが、使用する前に2度考えてください。余分なパラメータは、テストを容易にするために、明確な依存関係を持つことができます... – Jarod42

答えて

1

ここが一方的です。それはあなたが「正しい方法」であるかについて十分な制約を与えていない(例えば、std::cout自体)グローバルシングルトンを管理するために

// globals.hpp 
#include <istream> 

struct globals_object 
{ 
    globals_object() 
    { 
     // record number of source files which instanciate a globals_object 
     ++init_count_; 
    } 

    ~globals_object() 
    { 
     // The last source file cleans up at program exit 
     if(--init_count_ == 0) 
     { 
      if (pimpl_) 
      { 
       delete pimpl_; 
      } 
     } 
    } 

    // internal implementation 
    struct impl 
    { 
     void load(std::istream& is) 
     { 
      // do loading code here 
     } 

     int get_param_a() const { 
      return a_; 
     } 

     int a_; 
    }; 

    // (re)load global state  
    void load(std::istream&& is) 
    { 
     if (pimpl_) delete pimpl_; 
     pimpl_ = new impl; 
     pimpl_->load(is); 
    } 

    // public parameter accessor  
    int get_param_a() const { 
     return get_impl().get_param_a(); 
    } 

private:  
    static int init_count_; 
    static impl* pimpl_; 
    static impl& get_impl() 
    { 
     return *pimpl_; 
    } 
}; 
// one of these per translation unit 
static globals_object globals; 


// globals.cpp 

// note - not initialised - will be zero-initialised 
// before global constructors are called 
// you need one of these in a cpp file 
int globals_object::init_count_; 
globals_object::impl* globals_object::pimpl_; 


// main file 

// #include "globals.hpp" 
#include <fstream> 

int main() 
{ 
    globals.load(std::ifstream("settings.yml")); 

} 


// any other file 

// #include "globals.hpp" 
#include <iostream> 

void foo() 
{ 
    std::cout << globals.get_param_a() << std::endl; 
} 
関連する問題