脚本 - 值类型 - 如何处理此问题?

时间:2013-02-13 19:17:10

标签: c++

我正在编写自己的脚本语言,需要以某种方式处理值类型。

我需要在我的脚本中定义变量值,如下面的代码段

#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();
}

有人可以说明你如何解决这个问题吗?

感谢。

3 个答案:

答案 0 :(得分: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_;
};

我会为每个可能的变量类型执行此操作。

唯一一次变得棘手的是操作应该“上转换”l值。例如,在我的脚本语言char + string == string中,为了与string + char == string

保持一致

答案 1 :(得分:0)

我最近遇到了类似的问题。 我将每个变量存储为void pointer,然后当我想访问该值时,我只会传递void指针和我想要设置的值。

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

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

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

答案 2 :(得分:0)

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

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