#include <iostream>
struct foobar {
foobar( int a, int b ) {
std::cout << "foobar created with " << a << " " << b << "\n";
}
};
struct barbaz {
barbaz( int a ) {
std::cout << "barbaz created with " << a << "\n";
}
};
template <typename T>
auto make( int a, int b ) -> decltype( T( a ,b ) ) {
return T( a, b );
}
template <typename T>
auto make( int a, int b ) -> decltype( T( a ) ) {
return T( a );
}
int main() {
auto x = make<foobar>( 10, 42 );
auto y = make<barbaz>( 10, 42 );
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IGZvb2JhciB7CiAgICBmb29iYXIoIGludCBhLCBpbnQgYiApIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgImZvb2JhciBjcmVhdGVkIHdpdGggIiA8PCBhIDw8ICIgIiA8PCBiIDw8ICJcbiI7CiAgICB9Cn07CgpzdHJ1Y3QgYmFyYmF6IHsKICAgIGJhcmJheiggaW50IGEgKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJiYXJiYXogY3JlYXRlZCB3aXRoICIgPDwgYSA8PCAiXG4iOwogICAgfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmF1dG8gbWFrZSggaW50IGEsIGludCBiICkgLT4gZGVjbHR5cGUoIFQoIGEgLGIgKSApIHsKICAgIHJldHVybiBUKCBhLCBiICk7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgphdXRvIG1ha2UoIGludCBhLCBpbnQgYiApIC0+IGRlY2x0eXBlKCBUKCBhICkgKSB7CiAgICByZXR1cm4gVCggYSApOwp9CgppbnQgbWFpbigpIHsKICAgIGF1dG8geCA9IG1ha2U8Zm9vYmFyPiggMTAsIDQyICk7CiAgICBhdXRvIHkgPSBtYWtlPGJhcmJhej4oIDEwLCA0MiApOwp9Cg==