fork download
  1. #include <iostream>
  2. #include <string>
  3.  
  4. // Reusable
  5.  
  6. template<int i, class T>
  7. struct optional_type{
  8. enum{ pos = i};
  9. typedef T value_type;
  10.  
  11. T val_;
  12.  
  13. const T& value()const{return val_;}
  14. optional_type(T rv):val_(rv){}
  15.  
  16. optional_type():val_(){}
  17.  
  18.  
  19. };
  20.  
  21. template<int i, class T>
  22. struct required_type{
  23. enum{ pos = i};
  24. typedef T value_type;
  25.  
  26. T val_;
  27.  
  28. const T& value()const{return val_;}
  29. required_type(T rv):val_(rv){}
  30.  
  31. private:
  32. required_type();
  33.  
  34.  
  35. };
  36.  
  37. template<int i, class T,class F>
  38. struct defaulted_type{
  39. enum{ pos = i};
  40. typedef T value_type;
  41. F f;
  42. T val_;
  43.  
  44. const T& value()const{return val_;}
  45. defaulted_type(T rv):val_(rv){}
  46.  
  47. defaulted_type():val_(f()){}
  48.  
  49.  
  50. };
  51.  
  52.  
  53.  
  54.  
  55. template<class... Args>
  56. struct arg_holder:public Args...{
  57.  
  58. template<class T>
  59. const typename T::value_type& get()const{
  60. const T* ret = this;
  61. return ret ->value();
  62. }
  63.  
  64. template<class... T>
  65. arg_holder(T... t):T(t)...{};
  66.  
  67.  
  68. };
  69.  
  70. // What you need to implement for a function
  71. struct user_arg_default{
  72. std::string operator()(){return "Somebody";};
  73. };
  74.  
  75. typedef optional_type<0,int> value;
  76. typedef defaulted_type<1,std::string,user_arg_default> user;
  77. typedef required_type<2,int> required;
  78.  
  79.  
  80. void greet(const arg_holder<value,user,required>& a){
  81. std::cout << "Hello " << a.get<user>() << " the value is " << a.get<value>()
  82. << " Required " << a.get<required>() << std::endl;
  83. }
  84.  
  85. int main(){
  86. greet({required(11)});
  87. greet({required(11),value(10)});
  88. greet({user("John"),required(11),value(10)});
  89. greet({required(11),user("John")});
  90.  
  91. // the required parameter is required, if you uncomment below, you will get an error
  92. //greet({});
  93. //greet({value(10)});
  94. //greet({user("John"),value(10)});
  95. //greet({user("John")});
  96. }
Success #stdin #stdout 0s 3032KB
stdin
Standard input is empty
stdout
Hello Somebody the value is 0 Required 11
Hello Somebody the value is 10 Required 11
Hello John the value is 10 Required 11
Hello John the value is 0 Required 11