2017-07-15 7 views
0

私はObjectを構築するクラスBuilderをいくつか持っています。私はObjectの中身の一部をポリシーオブジェクトに置き換える計画があります。たとえば、いくつかのコンテナタイプStorageを設定することができます。具体的には、Builderを使用して、Objectのポリシーオブジェクトを設定したい場合は、何らかのデフォルトに戻すことをお勧めします。私の頭の上から、そのような何か:C++ポリシーオブジェクトとビルダーパターン

class Builder { 
public 
    Builder(); 

    // ... builder methods 

    template<typename S> 
    Builder& storage() { Storage = S; } 

    Object init() { return Object<Storage>(...); } 

private: 
    typedef std::vector Storage; 
} 

template<typename Storage> 
class Object { ... } 

Object o = Builder() 
    .storage<std::list>() 
    .init() 

は質問の核心は次のとおりです。私は、ユーザー定義されたテンプレート変数を格納することができますので、私は、「テンプレート変数」の一種としてのtypedefを使用することができますか?

コンテキストをさらに提供するために、Builderは、json設定ファイルからかなり複雑なObjectを作成し、各キーとその検証を個々のメソッドに委譲することをサポートする必要があります。私は静的な名前のコンストラクタBuilder::from_config(...)と私のためにそれを行う方法Builder::load_config(...)がありますが、私は設定ファイルからポリシーオブジェクトを選ぶことをサポートしたいと思います。それ以外の場合は、Builder::init()メソッドにテンプレートを追加するだけで問題なく、ポリシーオブジェクトをObjectに渡すことができます。

答えて

1

私は質問の核心が何であるかを正確にしたいけど...

理解していないではない:私は "の一種としてのtypedefを使用することができますテンプレート変数 "ので、私はユーザー定義のテンプレート変数を格納することができますか?

私はそうは思わない。タイプは変数ではなくテンプレートパラメータです。 typedefは固定されたエンティティであり、(私が知る限り)変更することはできません。

また:std::vector<int>がタイプですが、std::vectorではないので

typedef std::vector Storage; 

は動作しません。

ただし、std::vectorはテンプレートテンプレートパラメータです。

テンプレートテンプレートパラメータを持つ内部テンプレート構造体Storageです。

次は私がそうでなければ、私はちょうど `builder.init を()だろう、JSONファイル内のキーの値に基づいてタイプを設定する必要が

#include <list> 

template <template <typename ...> class C> 
class Object 
{ }; 

class Builder 
{ 
    private: 
     template <template <typename...> class C> 
     struct Storage 
     { Object<C> init() { return Object<C>{}; } }; 

    public: 
     Builder() 
     { } 

     template <template <typename...> class C> 
     Storage<C> & storage() { static Storage<C> ret{}; return ret; } 
}; 

int main() 
{ 
    auto o = Builder{}.storage<std::list>().init(); 

    static_assert(std::is_same<decltype(o), Object<std::list>>{}, "!"); 
} 
+0

感謝あなたは非常に!これは本質的に私の質問に答えます。私はjson設定ファイルから善意を選ぶ能力が必要です。言い換えれば、文字列の値に基づいて別のパラメータを指定する必要がありますが、 'Builder'の' load_config'メソッドでそれをやりたいのです。 – gwelof

0

理由だけ

template <template<class...> class StorageT> 
class Builder 
{ 
    // ... 
    StorageT<Object> storage_; 
}; 

Builder<std::vector>()...; 
Builder<std::list>()...; 
+0

コンパイルの例である;' – gwelof

関連する問題