#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