#include <iostream>
#include <vector>
template < typename Derived, typename R, typename T >
struct cascade_call_base {
typedef R result_type;
typedef T param_type;
typedef param_type const & param_ref;
typedef std::vector<param_type> params_type;
typedef params_type const & params_ref;
struct param_packer {
Derived & callee;
params_type params;
param_packer( Derived & callee, param_ref first )
: callee(callee), params( 1, first )
{ }
param_packer& operator,( param_ref append ) {
params.push_back( append );
return *this;
}
operator result_type() {
return callee.invoke( params );
}
};
param_packer
operator,( param_ref first ) {
return param_packer( static_cast<Derived&>(*this), first );
}
};
struct Test : cascade_call_base<Test,int,int> {
result_type
invoke( params_ref params ) {
return params.size();
}
} test;
int main() {
using namespace std;
cout << (test,1,2,3) << endl;
cout << (test,4,5) << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgogCnRlbXBsYXRlIDwgdHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgUiwgdHlwZW5hbWUgVCA+CnN0cnVjdCBjYXNjYWRlX2NhbGxfYmFzZSB7CiAgICAKICAgIHR5cGVkZWYgUiByZXN1bHRfdHlwZTsKICAgIAogICAgdHlwZWRlZiBUIHBhcmFtX3R5cGU7CiAgICB0eXBlZGVmIHBhcmFtX3R5cGUgY29uc3QgJiBwYXJhbV9yZWY7CiAgICAKICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8cGFyYW1fdHlwZT4gcGFyYW1zX3R5cGU7CiAgICB0eXBlZGVmIHBhcmFtc190eXBlIGNvbnN0ICYgcGFyYW1zX3JlZjsKICAgIAogICAgc3RydWN0IHBhcmFtX3BhY2tlciB7CiAgICAgICAgRGVyaXZlZCAmIGNhbGxlZTsKICAgICAgICBwYXJhbXNfdHlwZSBwYXJhbXM7CiAgICAgICAgCiAgICAgICAgcGFyYW1fcGFja2VyKCBEZXJpdmVkICYgY2FsbGVlLCBwYXJhbV9yZWYgZmlyc3QgKSAKICAgICAgICA6IGNhbGxlZShjYWxsZWUpLCBwYXJhbXMoIDEsIGZpcnN0ICkKICAgICAgICB7IH0KICAgICAgICAKICAgICAgICBwYXJhbV9wYWNrZXImIG9wZXJhdG9yLCggcGFyYW1fcmVmIGFwcGVuZCApIHsKICAgICAgICAgICAgcGFyYW1zLnB1c2hfYmFjayggYXBwZW5kICk7CiAgICAgICAgICAgIHJldHVybiAqdGhpczsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgb3BlcmF0b3IgcmVzdWx0X3R5cGUoKSB7CiAgICAgICAgICAgIHJldHVybiBjYWxsZWUuaW52b2tlKCBwYXJhbXMgKTsKICAgICAgICB9CiAgICB9OwogICAgCiAgICBwYXJhbV9wYWNrZXIKICAgIG9wZXJhdG9yLCggcGFyYW1fcmVmIGZpcnN0ICkgewogICAgICAgIHJldHVybiBwYXJhbV9wYWNrZXIoIHN0YXRpY19jYXN0PERlcml2ZWQmPigqdGhpcyksIGZpcnN0ICk7CiAgICB9Cn07CiAKc3RydWN0IFRlc3QgOiBjYXNjYWRlX2NhbGxfYmFzZTxUZXN0LGludCxpbnQ+IHsKICAgIHJlc3VsdF90eXBlICAKICAgIGludm9rZSggcGFyYW1zX3JlZiBwYXJhbXMgKSB7CiAgICAgICAgcmV0dXJuIHBhcmFtcy5zaXplKCk7CiAgICB9Cn0gdGVzdDsKIAppbnQgbWFpbigpIHsKICAgIAogICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKICAgIAogICAgY291dCA8PCAodGVzdCwxLDIsMykgPDwgZW5kbDsKICAgIGNvdXQgPDwgKHRlc3QsNCw1KSA8PCBlbmRsOwp9