C ++动态属性

时间:2013-11-26 18:46:14

标签: c++

我不知道动态属性是否真的是正确的术语,但我希望能够通过某个容器在运行时定义属性。我正在寻找的用法如下:

Properties p;

p.Add<int>("age", 10);

int age = p.Get<int>("age");

我似乎无法解决这个问题,因为每个设置的容器都需要在模板类中,但我不想要每个基本类型的类,如int,float等。是我的在C ++中可能出现以上用法?

2 个答案:

答案 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::anyboost::variantstd::map结合使用可以满足您的需求。