C++动态创建类的属性

C++动态创建类的属性,第1张

场景说明

类创建的时候没有任何属性,下面这段代码实现了运行时为类添加属性的效果:


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

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/2889659.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-09-14
下一篇2022-09-14

发表评论

登录后才能评论

评论列表(0条)

    保存