1

私は独自のスクリプト言語を作成しており、何らかの方法で値の型を処理する必要があります。

以下のスニペットのように、スクリプトで変数値を定義する必要があります

#Var #Name="Alpha" #Class="Float" #Value=1.0
#Var #Name="Beta" #Class="Int" #Value=1
#Var #Name="Delta" #Class="Vector2" #Value=(1.0,2.0)
#Var #Name="Echo" #Class="String" #Value="abcdefgh"

ご覧のとおり、各 #Var には、想定される値のタイプを定義する #Class があります。

問題は、後で簡単な方法で値を管理できるように、「簡単に」アプローチする方法がわからないことです。

float fAlpha = GetVar("Alpha")->GetValue();
fAlpha = 150.0f;
GetVar("Alpha")->SetValue(fAlpha);

...

CVector2 vDelta = GetVar("Delta")->GetValue();
vDelta=CVector2(10.0,20.0);
GetVar("Delta")->SetValue(vDelta)

#Var #Class はいつでも確認できますが、より明確なオブジェクト指向のものを探しています。

if(GetVar("Alpha")->GetClass() == "Float")
{
float fAlpha = GetVar("Alpha")->GetValue();
}

誰かがこれにどのようにアプローチするかについて少し光を当てることができますか?

ありがとう。

4

3 に答える 3

1

過去にこれを処理した方法は、継承と仮想関数を使用していました。

変数を作成するときは、次のようにします。

variable_base *var = new variable_int;

これは次のように実装されています。

class variable_base {
public:
    virtual ~variable_base() {}

public:
    virtual variable_base *clone() const = 0;

public:
    // all operations you can do to a variable as pure virtual functions here
    virtual variable_base *operator+=(const variable_base *rhs) = 0;
    // ...
};

class variable_int : public variable_base {
public:
    virtual variable_base *clone() const { return new variable_int(*this); }

public
    virtual variable_base *operator+=(const variable_base *rhs) {
        if(variable_int *other = dynamic_cast<variable_int *>(rhs)) {
            // int += int
            value_ += other->value_;
        } else {
            // throw exception, or convert, whatever you want
        }
        return this;
    }

private:
    int value_;
};

考えられる変数の型ごとにこれを行います。

注意が必要なのは、操作で左辺値を「アップコンバート」する必要がある場合だけです。たとえば、私のスクリプト言語char + string == stringでは、一貫性を保つためにstring + char == string

于 2013-02-13T19:37:52.647 に答える
0

最近、同様の問題がありました。すべての変数をvoid ポインターとして格納し、値にアクセスしたいときは、void ポインターと設定したい値を渡すだけでした。

変数の型ごとに 1 つずつ、4 つほどの関数をオーバーロードしましたが、すべて同じ名前でした。

setValue(&currentVoidPointerToVar , string("value") )

正しい関数 (この場合は文字列関数) は、void ポインターに格納されている変数の型をチェックします。指定された値と一致する場合は、void ポインターを正しい型に再キャストし、このオブジェクトにアクセスして値を設定します。

于 2013-02-13T19:28:04.010 に答える
0

boost::program_optionsライブラリは基本的に同様のことを行います。既知のオプションのタイプを登録し、 を使用して値を取得しますboost::any

#Class適切なハンドラー (ファンクターなど) を提供する既知の文字列を使用して、値の抽出を識別することができます。

于 2013-02-13T19:38:23.007 に答える