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


