工厂的类型

时间:2012-12-19 20:39:07

标签: c++ design-patterns

为了创建算术求值器,我必须创建一个Factory,它将在参数中取一个字符串,并根据字符串返回不同类型的变量。

示例:

TypeFactory.make("int") return int i=0;
TypeFactory.make("float") return float f=0;

我想到了许多不同类型的实现,但似乎都没有:

我可以创建一个类Type,以及它的子类Float和Int,它们将由工厂返回,但是我怎样才能以通用的方式获取类中的值(比如Type.getVal(),它会不会不存在,所以我不能在我的程序的其余部分使用它)

我希望我的问题清楚(对我来说甚至不是很清楚!)

有没有人有想法? 感谢

编辑:

当我意识到这个问题很难解决时,我会以更一般的方式解释我必须做的事情。

目标是评估文件中的算术表达式。 例:

int a;
float b;
float c;
a=1;
b=6;
c=a+b;

这是我的档案。 我的程序将从这些表达式构造一个Tree。我使用Composite和Visitor模式。但我的问题是,我必须先区分每种类型,以便在我的访问者进行操作时告诉哪个变量属于哪种类型,并且能够获得正确类型的结果。

2 个答案:

答案 0 :(得分:2)

我的理解是你要解析和评估类型化的算术表达式。

通常的策略(在编译器中使用)是构建一个抽象语法树,然后评估这个树。 你需要的模式是 http://en.wikipedia.org/wiki/Visitor_pattern

基本上,您将程序/表达式表示为节点树。 Node是一个抽象类,有许多派生类型,代表每种类型的表达式。 访问者模式允许您为每种类型的节点调用正确的访问者,从而决定要执行的正确代码。

struct Visitor
{
  void process(IntNode i) { int r = i.getInt(); ... }
  void process(FloatNode f) { float r = f.getFloat(); ... }
};

struct Node
{
    virtual void getProcessed(Visitor v);
};
struct IntNode : Node
{
    virtual void getProcessed(Visitor v) { v.process(*this); }
    int getInt() {...};
};

答案 1 :(得分:0)

如果您有可能类型的有限列表,请尝试boost::variant

假设您只支持intfloat。然后,您的数据将存储为boost::variant<int,float>

要访问这些值,您需要使用apply_visitor。添加两个值需要双重调度,这很棘手,但可行。您的访问者然后访问另一个参数,并根据这两种类型生成不同的结果。