#include <iostream>
#include <ostream>
using namespace std;
struct OneOfParamCont
{
int param1;
float param2;
};
template<typename ParamClass, typename ParamType>
ParamType QueryParam( ParamType (ParamClass::*param), const ParamType& defaultVal = ParamType() )
{
return defaultVal;
}
template<typename ResultType, typename ParamClass, typename ParamType>
ResultType QueryParam( ParamType (ParamClass::*param), const ResultType& defaultVal = ResultType() )
{
return defaultVal;
}
int main()
{
float t1 = QueryParam( &OneOfParamCont::param2, 1.f );
float t2 = QueryParam( &OneOfParamCont::param2, 1 );
float t3 = QueryParam( &OneOfParamCont::param2 );
float t4 = QueryParam( &OneOfParamCont::param2 );
float t5 = QueryParam<float>( &OneOfParamCont::param2, 1.f );
float t6 = QueryParam<float>( &OneOfParamCont::param2, 1 );
float t7 = QueryParam<int>( &OneOfParamCont::param2, 1.f );
float t8 = QueryParam<int>( &OneOfParamCont::param2, 1 );
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8b3N0cmVhbT4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgT25lT2ZQYXJhbUNvbnQKewogICAgaW50IHBhcmFtMTsKICAgIGZsb2F0IHBhcmFtMjsKfTsKdGVtcGxhdGU8dHlwZW5hbWUgUGFyYW1DbGFzcywgdHlwZW5hbWUgUGFyYW1UeXBlPgpQYXJhbVR5cGUgIFF1ZXJ5UGFyYW0oIFBhcmFtVHlwZSAoUGFyYW1DbGFzczo6KnBhcmFtKSwgY29uc3QgUGFyYW1UeXBlJiBkZWZhdWx0VmFsID0gUGFyYW1UeXBlKCkgKQp7CglyZXR1cm4gZGVmYXVsdFZhbDsKfQp0ZW1wbGF0ZTx0eXBlbmFtZSBSZXN1bHRUeXBlLCB0eXBlbmFtZSBQYXJhbUNsYXNzLCB0eXBlbmFtZSBQYXJhbVR5cGU+ClJlc3VsdFR5cGUgIFF1ZXJ5UGFyYW0oIFBhcmFtVHlwZSAoUGFyYW1DbGFzczo6KnBhcmFtKSwgY29uc3QgUmVzdWx0VHlwZSYgZGVmYXVsdFZhbCA9IFJlc3VsdFR5cGUoKSApCnsKCXJldHVybiBkZWZhdWx0VmFsOwp9CmludCBtYWluKCkKewogICAgZmxvYXQgdDEgPSBRdWVyeVBhcmFtKCAmT25lT2ZQYXJhbUNvbnQ6OnBhcmFtMiwgMS5mICk7CiAgICBmbG9hdCB0MiA9IFF1ZXJ5UGFyYW0oICZPbmVPZlBhcmFtQ29udDo6cGFyYW0yLCAxICk7CiAgICBmbG9hdCB0MyA9IFF1ZXJ5UGFyYW0oICZPbmVPZlBhcmFtQ29udDo6cGFyYW0yICk7CiAgICBmbG9hdCB0NCA9IFF1ZXJ5UGFyYW0oICZPbmVPZlBhcmFtQ29udDo6cGFyYW0yICk7CiAgICBmbG9hdCB0NSA9IFF1ZXJ5UGFyYW08ZmxvYXQ+KCAmT25lT2ZQYXJhbUNvbnQ6OnBhcmFtMiwgMS5mICk7CiAgICBmbG9hdCB0NiA9IFF1ZXJ5UGFyYW08ZmxvYXQ+KCAmT25lT2ZQYXJhbUNvbnQ6OnBhcmFtMiwgMSApOwogICAgZmxvYXQgdDcgPSBRdWVyeVBhcmFtPGludD4oICZPbmVPZlBhcmFtQ29udDo6cGFyYW0yLCAxLmYgKTsKICAgIGZsb2F0IHQ4ID0gUXVlcnlQYXJhbTxpbnQ+KCAmT25lT2ZQYXJhbUNvbnQ6OnBhcmFtMiwgMSApOwp9