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>>{}, "!");
}
我有一些 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>>{}, "!");
}