#include #include #include #include struct Parameter{}; template struct TypedParameter : public Parameter { public: TypedParameter (const T& data): data(data){}; T data; }; struct ParameterList { std::map> list; //ParameterList(){} ParameterList(const ParameterList& other):list(other.list){} template ParameterList(std::pair const &... keyvalues) { addPair(keyvalues...); } template void addParameter(const std::wstring& name, const T& param) { list[name] = std::shared_ptr(new TypedParameter(param)); } template void addPair(std::pair param) { addParameter(param.first, param.second); } template T& getParameter(const std::wstring& name) const { return static_cast*>(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(L"name"); std::wcout << L" and I'm " << _param.getParameter(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(); }