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

标签 c++ c++11 builder-pattern policy-based-design

我有一些 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 用作一种“模板变量”以便存储用户定义的模板变量?

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

最佳答案

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

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

关于C++ 策略对象和构建器模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45120356/

相关文章:

C++11:确保一次写入多次读取的定义语义?

C++ 堆内存性能改进

c++ - qt中什么时候应该将子对象声明为其父类的成员变量?

c++ - QCompleter::activated disconnected after losing and gaining focus

c++ - 为什么在使用队列处理扫雷中的相邻单元格时会出现无限循环?

c++ - 如何在 Autoconf 中使用 C++11 功能?

c++ - vector 乘法中的 SIMD 与 OMP

Python,结合长构建器路径和注释

java - builder 模式与失败

java - 使用 Builder 模式为客户端库注入(inject) Guice