我正在创建一个属性类,它将唯一键和任意值存储为字符串(以及在写入配置文件时使用的可选注释字符串)。目前我正在使用创建基本属性类的方法来保存原始字符串,然后将其子类化为特定于类型的属性 - 例如。一个IntProperty,它实现了一个将字符串转换为int的getValue()函数 - 以避免每次我想要读取它时都必须从字符串手动转换属性值。这些子类使用getPropertyType(),一个在基类中定义并在每个派生中重写的虚函数,返回一个枚举值来标识它们所拥有的属性类型,并且基类返回一个“无”标识符。
(作为旁注,我避开模板,因为我正在使用Qt,并且其所需的接口宏不支持模板化对象。如果值得使用模板,我可能会放弃使用接口的想法。)
我的目的是通过从基本属性类继承它们并允许基本属性指针数组来允许列出多种不同类型的属性(string,int,float ...)。但是,我遇到的问题是,从一个派生类中提取属性作为特定类型变得非常尴尬,因为指向基类的指针显然不知道派生类中新定义的getValue函数。我可以选择从基类中提取字符串并手动转换或通过将基类指针转换为正确的派生类指针。第一个选项通过要求我手动执行转换来使子类无用,而第二个选项听起来像是代码的噩梦,因为每次我想要确定指向哪个指针时,属性标识符值都会涉及大的switch语句演员。
解决这个问题最聪明的方法是什么?我希望尽可能简单地检索属性值 - 即。尽可能少的样板代码从获取数组的基类指针到保存属性值的正确类型的副本。是否值得考虑相反的问题 - 有多个强类型属性类,它们都支持使用字符串获取和设置各自的值?
答案 0 :(得分:2)
这个怎么样? (未经测试,但你应该明白这一点)
class BaseType {
public:
virtual void getValue(string &s) { s = ""; };
virtual void getValue(int &i) { i = 0; };
virtual void getValue(double &d) { d = 0.0; };
};
class IntType : public BaseType {
public:
virtual void getValue(string &s) { s = to_string(myvalue); };
virtual void getValue(int &i) { i = myvalue; };
virtual void getValue(double &d) { d = static_cast<double>(myvalue); };
private:
int myvalue;
};
class DblType : public BaseType {
public:
virtual void getValue(string &s) { s = to_string(myvalue); };
virtual void getValue(int &i) { i = static_cast<int>myvalue; };
virtual void getValue(double &d) { d = myvalue; };
private:
double myvalue;
};
class StrType : public BaseType {
public:
virtual void getValue(string &s) { s = myvalue; };
virtual void getValue(int &i) { i = stoi(myvalue); };
virtual void getValue(double &d) { d = stod(myvalue); };
private:
string myvalue;
};
答案 1 :(得分:0)
当然,由于接收方需要知道它的类型,使用一个名称来表明你得到了什么,例如
int GetInt(const string& key);
string GetString(const string& key);
double GetDouble(const string& key);
等。就像调用它Get(const string& key)
一样好 - 并且由于C ++语言不允许你仅仅区分返回类型,这是行不通的。
另一种选择当然是
template <typename T>
void Get(const string& key, T& value);
(可能需要以不同的方式实际实现所有不同的变体,因此使用模板可能没有多大帮助,但是我更容易将答案写为模板!;))