fork download
  1. #include <string>
  2. #include <map>
  3. #include <memory>
  4. #include <iostream>
  5.  
  6. struct Parameter{};
  7.  
  8. template<typename T>
  9. struct TypedParameter : public Parameter
  10. {
  11. public:
  12. TypedParameter (const T& data): data(data){};
  13. T data;
  14. };
  15.  
  16. struct ParameterList
  17. {
  18. std::map<std::wstring, std::shared_ptr<Parameter>> list;
  19.  
  20. //ParameterList(){}
  21.  
  22. ParameterList(const ParameterList& other):list(other.list){}
  23.  
  24. template<typename... KeyValues>
  25. ParameterList(KeyValues const &... keyvalues)
  26. {
  27. std::make_tuple( ( addPair(keyvalues), 0 )... );
  28. }
  29.  
  30. template<class T> void addParameter(const std::wstring& name, const T& param)
  31. {
  32. list[name] = std::shared_ptr<Parameter>(new TypedParameter<T>(param));
  33. }
  34.  
  35. template<class K, class T> void addPair(std::pair<K, T> const & param)
  36. {
  37. addParameter<T>(param.first, param.second);
  38. }
  39.  
  40. template<class T> T& getParameter(const std::wstring& name) const
  41. {
  42. return static_cast<TypedParameter<T>*>(list.at(name).get())->data;
  43. }
  44. };
  45.  
  46. class Test
  47. {
  48. private:
  49. ParameterList _param;
  50. protected:
  51. public:
  52. Test(ParameterList p): _param(p){}
  53.  
  54. void Present()
  55. {
  56. std::wcout << L"My name is " << _param.getParameter<std::wstring>(L"name");
  57. std::wcout << L" and I'm " << _param.getParameter<int>(L"age") << L" years old." << std::endl;
  58. }
  59. };
  60.  
  61. int main()
  62. {
  63. Test t1(ParameterList(
  64. std::make_pair(L"name", L"Vorel"),
  65. std::make_pair(L"age", 19870),
  66. std::make_pair(L"job", L"dragon")));
  67.  
  68. t1.Present();
  69.  
  70. getchar();
  71. }
  72.  
Success #stdin #stdout 0s 3092KB
stdin
Standard input is empty
stdout
My name is Vorel years old.My name is  and I'm ?????????????????????????????????????????????????????????? and I'm 19870 years old.