#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... Values>
ParameterList(std::pair<std::wstring, Values> const &... keyvalues)
{
addPair<Values>(keyvalues...);
}
template<class T> void addParameter(const std::wstring& name, const T& param)
{
list[name] = std::shared_ptr<Parameter>(new TypedParameter<T>(param));
}
template<class T> void addPair(std::pair<std::wstring, T> 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(
std::make_pair(L"name", L"Vorel"),
std::make_pair(L"age", 19870),
std::make_pair(L"job", L"dragon"));
t1.Present();
getchar();
}