0

Builderを構築するクラスがありますObject。の内臓の一部をポリシー オブジェクトに置き換える計画がありObjectます。たとえば、いくつかのコンテナ タイプを設定できるようにしStorageます。具体的には、 を使用して のBuilderポリシー オブジェクトを設定しObject、何も指定されていない場合はデフォルトにフォールバックします。私の頭の上から、次のようなもの:

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 を一種の「テンプレート変数」として使用して、ユーザー定義のテンプレート変数を格納できるかどうかです。

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

4

2 に答える 2

1

あなたが何を望んでいるのか正確にはわかりませんが...

問題の要点は、typedef を一種の「テンプレート変数」として使用して、ユーザー定義のテンプレート変数を格納できるかどうかです。

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

さらに:

typedef std::vector Storage;

std::vector<int>タイプであるため機能しませんが、std::vectorそうではありません。

ただしstd::vector、テンプレート テンプレート パラメーターにすることはできます。

あなたを助けるために私が想像できる最高のものはStorage、 template-template パラメーターを持つ内部テンプレート構造体です。

以下はコンパイル可能な例です

#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>>{}, "!");
 }
于 2017-07-15T19:00:46.527 に答える
0

なぜだけではないのですか

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

Builder<std::vector>()...;
Builder<std::list>()...;
于 2017-07-15T18:53:09.363 に答える