【发布时间】:2018-11-12 10:01:14
【问题描述】:
我正在尝试基于用户可以选择编译时间的一些枚举值创建一种工厂。
这里的主要内容是创建一种神奇的开关,它适用于不止一种枚举的不同值(不同联合值的联合,可能具有相同的值)。
enum class A {A1, A2, A3, A4};
enum class B {B1, B2, B3, B4, B6, B7};
struct ObjectBase
{
virtual void apply(char input) = 0;
};
template<A a, class... Args>
struct Object : ObjectBase;
template<>
struct Object<A::A1, int> : ObjectBase
{
Object(int i) i_(i) { }
void apply(char input) { /*do stuff with i_*/}
int i_;
}
template<>
struct Object<A::A2, int, double> : ObjectBase
{
Object(int i, double d) i_(i), d_(d) { }
void apply(char input) { /*do stuff with i_*/}
int i_;
double d_;
}
template<class V, V value>
struct Element
{
};
template<class V, V first, V last>
struct AllElementWithin
{
};
Switcher< Element<A,A1>, Element<A,A2>,
AllElementWithin<B, B1, B3> > switcher (2, 4.0);
// This should create a switch / lookup table that
// initializes for instance Object<A::A1> with 2
// and Object<A::A2> with 2 and 4
char myInput = 'F';
ObjectBase* ob = switcher.create(A::A1);
// This should return an ObjectBase* that points to a
// Object<A1,int>
ob->apply(myInput);
我可以在这里利用一个已经知道的实现模式吗?我不想重新发明轮子。
最好是用 C++11 编译的东西
[编辑]更多信息:
工厂应该允许以有效的方式创建不同类型的对象(从特定的基类继承)。理想情况下,想要添加更多对象的用户类可以只创建他的枚举和一些定义所需行为的类,然后简单地使用带有这些枚举的工厂以及其他人定义的其他一些枚举。
如果不清楚,请要求其他说明
【问题讨论】:
-
不知怎的,我觉得
std::variant值得一看。 -
也许你应该稍微澄清一下这个问题——也许重命名类等等。目前尚不清楚这是您的目标是抽象工厂模式还是具体工厂模式。从您显示的代码和您的命名来看,它看起来更像是一个混凝土工厂。
-
@Scheff 我也想过用它来代替虚拟方法。我会选择这样做。
-
@darune 是的,也许我最好澄清一下。我将编辑问题
-
您是否尝试过像
std::vector< std::variant<A, B> > switch_type_one = {A::A1, A::A2, B::B1};这样非常简单的事情?也许通过一些巧妙的输入,它甚至可以扩展为用于查找构造参数的地图(尽管我不确定这会有多困难)。这种解决方案会有什么问题?
标签: c++ templates enums factory template-meta-programming