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,但我正在寻找更清晰/OO的东西。

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 指针和我想将其设置为的值。

我重载了四个左右的函数,每个变量类型一个,但都具有相同的名称。

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

然后,正确的函数(在本例中为字符串 one)将检查存储在 void 指针处的变量类型。如果它与指定的值匹配,它会将 void 指针重新转换为正确的类型,然后访问该对象,然后设置该值。

于 2013-02-13T19:28:04.010 回答
0

boost::program_options基本上做了类似的事情。您注册已知选项的类型并使用 检索值boost::any

#Class您可以使用提供适当处理程序(例如仿函数)的已知字符串来区分值提取。

于 2013-02-13T19:38:23.007 回答