2013-11-26 189 views
2

我不知道動態屬性是否真的是合適的術語,但我希望能夠通過某個容器在運行時定義屬性。我尋找的用法是類似以下內容:C++動態屬性

Properties p; 

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

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

我似乎無法工作了這一點,因爲每個設置的容器將需要一個模板類,但我不知道想要像int,float等每種基本類型的類。在C++中,我的用法可能在上面嗎?

+0

C++ 11 auto可能工作 – Damian

+0

對不起,忘記提及這不會在C++ 11中,如果可能的話不會提升。我發誓我曾經這樣做過,但似乎無法找到任何代碼。 – user441521

回答

2

我認爲boost::anyboost::variant結合std::map會做你想做的。

+0

任何選項沒有提升,並有自己的滾動?只是爲了好玩:) – user441521

+1

@ user441521肯定。看看'boost :: any'或'boost :: variant'。在'my_name_space :: any'或'my_name_space :: variant'中寫入基本相同的接口。弄錯了,沮喪地發誓,並使用'boost'。 – Yakk

+0

我正在尋找增強任何/變體,它似乎臃腫。我發誓我之前沒有做過這樣的事情(代碼少得多),但我找不到任何代碼。 – user441521

1

我記得現在。訣竅是使用不是模板化的基類,然後創建一個模板化的子類,並使用容器中的基類來存儲它,並使用模板化函數來處理它。

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

快樂你找到它! – Damian