
类创建的时候没有任何属性,下面这段代码实现了运行时为类添加属性的效果:
#include
#include
#include
using namespace std;
class property{
public:
property(){}
virtual ~property(){}
};
template <typename T>
class specific_property : public property{
private:
T data;
public:
specific_property():property(){}
void setValue(T& _data){data = _data;}
T getValue(){ return data; }
};
class State{
private:
unordered_map<string, property*> props;
public:
template <typename T>
void add_property(string name);
template <typename T>
void set_property(string name, T& value);
template <typename T>
void set_property(string name, T&& value);
template <typename T>
T get_value(string name);
vector<string> get_properties();
};
template <typename T>
void State::add_property(string name)
{
if(!props[name])
props[name] = new specific_property<T>;
}
template <typename T>
void State::set_property(string name, T& value)
{
if(!props[name])
return;
specific_property<T>* p;
p = reinterpret_cast<specific_property<T>*>(props[name]);
p->setValue(value);
}
template <typename T>
void State::set_property(string name, T&& value)
{
if(!props[name])
return;
specific_property<T>* p;
p = reinterpret_cast<specific_property<T>*>(props[name]);
p->setValue(value);
}
template <typename T>
T State::get_value(string name){
return ((specific_property<T>*)props[name])->getValue();
}
vector<string> State::get_properties()
{
vector<string> res;
unordered_map<string, property*>::iterator iter = props.begin();
while(iter!=props.end())
{
res.push_back(iter->first);
iter++;
}
return res;
}
int main()
{
State state;
state.add_property<int>("age");
state.set_property<int>("age", 20);
cout << state.get_value<int>("age") << endl;
state.add_property<string>("name");
state.set_property<string>("name", "zhangsan");
cout << state.get_value<string>("name") << endl;
vector<string> res = state.get_properties();
for(string str:res)
{
cout << str << endl;
}
return 0;
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)