C++ 策略对象和构建器模式

C++ policy objects and the builder pattern

我有一些 class Builder 可以构建 Object。我计划用策略对象替换一些 Object 的内容,例如能够设置一些容器类型 Storage。具体来说,我想使用 Builder 来设置 Object 的策略对象,如果指定 none 则回退到某些默认值;在我的脑海中,像这样:

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 作为一种 "template variable" 这样我就可以存储用户定义的模板变量吗?

为了提供更多上下文,Builder 必须支持从 json 配置文件创建相当复杂的 Object,将每个密钥及其验证委托给一个单独的方法。我有一个静态命名构造函数 Builder::from_config(...) 和一个方法 Builder::load_config(...) 为我执行此操作,但我想支持从配置文件中选择策略对象。否则我只需将模板添加到 Builder::init() 方法就可以了,这样我就可以将我的策略对象传递给 Object.

为什么不只是

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

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

我不明白你到底想要什么但是...

The crux of the question is: can I use a typedef as a sort of "template variable" so I can store a user defined template variable?

我不这么认为;类型可以是模板参数,而不是变量;所以 typedef 是一个固定的实体,(据我所知)无法更改。

此外:

typedef std::vector Storage;

不起作用,因为 std::vector<int> 是一种类型,但 std::vector 不是。

但是std::vector可以是模板-模板参数。

我能想到的最好的帮助你的是带有模板模板参数的内部模板结构Storage

下面是一个可编译的例子

#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>>{}, "!");
 }