3

算術エバリュエーターを作成するには、パラメーターに文字列を取り、文字列に応じて異なる型の変数を返す 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 を構築します。そのために、複合パターンと訪問者パターンを使用します。しかし、私の問題は、ビジターが操作を行うときにどの変数がどのタイプであるかを事前に区別し、適切なタイプの結果を得ることができるようにするために、各タイプを区別する必要があることです。

4

2 に答える 2

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() {...};
};
于 2012-12-19T21:19:24.430 に答える
0

boost::variant可能なタイプのリストが有限である場合に試してください。

と のみをサポートするintとしfloatます。その後、データはboost::variant<int,float>.

値にアクセスするには、 を使用しますapply_visitor。2 つの値を追加するには二重ディスパッチが必要であり、これはトリッキーですが実行可能です。一方の訪問者はもう一方の引数を訪問し、2 つのタイプに基づいて異なる結果を生成します。

于 2012-12-19T21:45:25.013 に答える