我正在编写自己的脚本语言,需要以某种方式处理值类型。
我需要在我的脚本中定义变量值,如下面的代码段
#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();
}
有人可以说明你如何解决这个问题吗?
感谢。
答案 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(¤tVoidPointerToVar , string("value") )
正确的函数(在本例中为字符串1)将检查存储在void指针处的变量的类型。如果它匹配指定的值,它会将void指针重新转换为正确的类型,然后访问该对象,然后设置值。
答案 2 :(得分:0)
boost::program_options
library基本上做了类似的事情。您可以使用boost::any
注册已知选项的类型并检索值。
您可以使用提供适当处理程序的已知#Class
字符串(例如仿函数)来区分值提取。