我不知道动态属性是否真的是正确的术语,但我希望能够通过某个容器在运行时定义属性。我正在寻找的用法如下:
Properties p;
p.Add<int>("age", 10);
int age = p.Get<int>("age");
我似乎无法解决这个问题,因为每个设置的容器都需要在模板类中,但我不想要每个基本类型的类,如int,float等。是我的在C ++中可能出现以上用法?
答案 0 :(得分:3)
我现在记得。诀窍是使用一个没有模板化的基类,然后创建一个模板化的子类,并使用容器中的基类来存储它和模板化函数来处理它。
#include <string>
#include <map>
using namespace std;
class Prop
{
public:
virtual ~Prop()
{
}
};
template<typename T>
class Property : public Prop
{
private:
T data;
public:
virtual ~Property()
{
}
Property(T d)
{
data = d;
}
T GetValue()
{
return data;
}
};
class Properties
{
private:
map<string, Prop*> props;
public:
~Properties()
{
map<string, Prop*>::iterator iter;
for(iter = props.begin(); iter != props.end(); ++iter)
delete (*iter).second;
props.clear();
}
template<typename T>
void Add(string name, T data)
{
props[name] = new Property<T>(data);
}
template<typename T>
T Get(string name)
{
Property<T>* p = (Property<T>*)props[name];
return p->GetValue();
}
};
int main()
{
Properties p;
p.Add<int>("age", 10);
int age = p.Get<int>("age");
return 0;
}
答案 1 :(得分:2)
我认为boost::any
或boost::variant
与std::map
结合使用可以满足您的需求。