#include <string>
#include <map>
#include <memory>
#include <iostream>
struct Parameter{};
template<typename T>
struct TypedParameter : public Parameter
{
public:
TypedParameter (const T& data): data(data){};
T data;
};
struct ParameterList
{
std::map<std::wstring, std::shared_ptr<Parameter>> list;
//ParameterList(){}
ParameterList(const ParameterList& other):list(other.list){}
template<typename... KeyValues>
ParameterList(KeyValues const &... keyvalues)
{
std::make_tuple( ( addPair(keyvalues), 0 )... );
}
template<class T> void addParameter(const std::wstring& name, const T& param)
{
list[name] = std::shared_ptr<Parameter>(new TypedParameter<T>(param));
}
template<class K, class T> void addPair(std::pair<K, T> const & param)
{
addParameter<T>(param.first, param.second);
}
template<class T> T& getParameter(const std::wstring& name) const
{
return static_cast<TypedParameter<T>*>(list.at(name).get())->data;
}
};
class Test
{
private:
ParameterList _param;
protected:
public:
Test(ParameterList p): _param(p){}
void Present()
{
std::wcout << L"My name is " << _param.getParameter<std::wstring>(L"name");
std::wcout << L" and I'm " << _param.getParameter<int>(L"age") << L" years old." << std::endl;
}
};
int main()
{
Test t1(ParameterList(
std::make_pair(L"name", L"Vorel"),
std::make_pair(L"age", 19870),
std::make_pair(L"job", L"dragon")));
t1.Present();
getchar();
}
ICAgICNpbmNsdWRlIDxzdHJpbmc+CiAgICAjaW5jbHVkZSA8bWFwPgogICAgI2luY2x1ZGUgPG1lbW9yeT4KICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KICAgICAKICAgIHN0cnVjdCBQYXJhbWV0ZXJ7fTsKICAgICAKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICBzdHJ1Y3QgVHlwZWRQYXJhbWV0ZXIgOiBwdWJsaWMgUGFyYW1ldGVyCiAgICB7CiAgICBwdWJsaWM6CiAgICAgICAgICAgIFR5cGVkUGFyYW1ldGVyIChjb25zdCBUJiBkYXRhKTogZGF0YShkYXRhKXt9OwogICAgICAgICAgICBUIGRhdGE7CiAgICB9OwogICAgIAogICAgc3RydWN0IFBhcmFtZXRlckxpc3QKICAgIHsKICAgICAgICAgICAgc3RkOjptYXA8c3RkOjp3c3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1ldGVyPj4gbGlzdDsKICAgICAKICAgICAgICAvL1BhcmFtZXRlckxpc3QoKXt9CiAgICAgCiAgICAgICAgUGFyYW1ldGVyTGlzdChjb25zdCBQYXJhbWV0ZXJMaXN0JiBvdGhlcik6bGlzdChvdGhlci5saXN0KXt9CiAgICAgCiAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gS2V5VmFsdWVzPgogICAgICAgIFBhcmFtZXRlckxpc3QoS2V5VmFsdWVzIGNvbnN0ICYuLi4ga2V5dmFsdWVzKQogICAgICAgIHsKICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKCAoIGFkZFBhaXIoa2V5dmFsdWVzKSwgMCApLi4uICk7CiAgICAgICAgfQogICAgIAogICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIGFkZFBhcmFtZXRlcihjb25zdCBzdGQ6OndzdHJpbmcmIG5hbWUsIGNvbnN0IFQmIHBhcmFtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGlzdFtuYW1lXSA9IHN0ZDo6c2hhcmVkX3B0cjxQYXJhbWV0ZXI+KG5ldyBUeXBlZFBhcmFtZXRlcjxUPihwYXJhbSkpOwogICAgICAgICAgICB9CiAgICAgCiAgICAgICAgdGVtcGxhdGU8Y2xhc3MgSywgY2xhc3MgVD4gdm9pZCBhZGRQYWlyKHN0ZDo6cGFpcjxLLCBUPiBjb25zdCAmIHBhcmFtKQogICAgICAgIHsKICAgICAgICAgICAgYWRkUGFyYW1ldGVyPFQ+KHBhcmFtLmZpcnN0LCBwYXJhbS5zZWNvbmQpOwogICAgICAgIH0KICAgICAKICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gVCYgZ2V0UGFyYW1ldGVyKGNvbnN0IHN0ZDo6d3N0cmluZyYgbmFtZSkgY29uc3QKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUeXBlZFBhcmFtZXRlcjxUPio+KGxpc3QuYXQobmFtZSkuZ2V0KCkpLT5kYXRhOwogICAgICAgICAgICB9CiAgICB9OwogICAgIAogICAgY2xhc3MgVGVzdAogICAgewogICAgcHJpdmF0ZToKICAgICAgICBQYXJhbWV0ZXJMaXN0IF9wYXJhbTsKICAgIHByb3RlY3RlZDoKICAgIHB1YmxpYzoKICAgICAgICBUZXN0KFBhcmFtZXRlckxpc3QgcCk6IF9wYXJhbShwKXt9CiAgICAgCiAgICAgICAgdm9pZCBQcmVzZW50KCkKICAgICAgICB7CiAgICAgICAgICAgIHN0ZDo6d2NvdXQgPDwgTCJNeSBuYW1lIGlzICIgPDwgX3BhcmFtLmdldFBhcmFtZXRlcjxzdGQ6OndzdHJpbmc+KEwibmFtZSIpOwogICAgICAgICAgICBzdGQ6Ondjb3V0IDw8IEwiIGFuZCBJJ20gIiA8PCBfcGFyYW0uZ2V0UGFyYW1ldGVyPGludD4oTCJhZ2UiKSA8PCBMIiB5ZWFycyBvbGQuIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgfQogICAgfTsKICAgICAKICAgIGludCBtYWluKCkKICAgIHsKICAgICAgICBUZXN0IHQxKFBhcmFtZXRlckxpc3QoCiAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKEwibmFtZSIsIEwiVm9yZWwiKSwKICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoTCJhZ2UiLCAxOTg3MCksCiAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKEwiam9iIiwgTCJkcmFnb24iKSkpOwogICAgIAogICAgICAgIHQxLlByZXNlbnQoKTsKICAgICAKICAgICAgICBnZXRjaGFyKCk7CiAgICB9Cg==