我不知道動態屬性是否真的是合適的術語,但我希望能夠通過某個容器在運行時定義屬性。我尋找的用法是類似以下內容:C++動態屬性
Properties p;
p.Add<int>("age", 10);
int age = p.Get<int>("age");
我似乎無法工作了這一點,因爲每個設置的容器將需要一個模板類,但我不知道想要像int,float等每種基本類型的類。在C++中,我的用法可能在上面嗎?
我不知道動態屬性是否真的是合適的術語,但我希望能夠通過某個容器在運行時定義屬性。我尋找的用法是類似以下內容:C++動態屬性
Properties p;
p.Add<int>("age", 10);
int age = p.Get<int>("age");
我似乎無法工作了這一點,因爲每個設置的容器將需要一個模板類,但我不知道想要像int,float等每種基本類型的類。在C++中,我的用法可能在上面嗎?
我認爲boost::any
或boost::variant
結合std::map
會做你想做的。
任何選項沒有提升,並有自己的滾動?只是爲了好玩:) – user441521
@ user441521肯定。看看'boost :: any'或'boost :: variant'。在'my_name_space :: any'或'my_name_space :: variant'中寫入基本相同的接口。弄錯了,沮喪地發誓,並使用'boost'。 – Yakk
我正在尋找增強任何/變體,它似乎臃腫。我發誓我之前沒有做過這樣的事情(代碼少得多),但我找不到任何代碼。 – user441521
我記得現在。訣竅是使用不是模板化的基類,然後創建一個模板化的子類,並使用容器中的基類來存儲它,並使用模板化函數來處理它。
#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;
}
快樂你找到它! – Damian
C++ 11 auto可能工作 – Damian
對不起,忘記提及這不會在C++ 11中,如果可能的話不會提升。我發誓我曾經這樣做過,但似乎無法找到任何代碼。 – user441521