#include <utility>
#include <tuple>
template < typename elem, typename tup, std:: size_t offset = 0 >
struct tuple_index
: std:: integral_constant < std:: size_t , offset > { } ;
template < typename elem, typename head, typename ... tail , std:: size_t offset >
struct tuple_index< elem, std:: tuple < head, tail ... > , offset >
: std:: integral_constant < std:: size_t , tuple_index< elem, std:: tuple < tail ... > , offset + 1 > :: value > { } ;
template < typename elem, typename ... tail , std:: size_t offset >
struct tuple_index< elem, std:: tuple < elem, tail ... > , offset >
: std:: integral_constant < std:: size_t , offset > { } ;
template < typename result, typename fallback, typename tuple >
typename std:: enable_if < tuple_index< result, typename std:: decay < tuple > :: type > :: value
== std:: tuple_size < typename std:: decay < tuple > :: type > :: value ,
fallback > :: type
get_or( tuple && t ) { return { } ; }
template < typename result, typename fallback, typename tuple >
typename std:: enable_if < tuple_index< result, typename std:: decay < tuple > :: type > :: value
! = std:: tuple_size < typename std:: decay < tuple > :: type > :: value ,
result > :: type
get_or( tuple && t ) {
return std:: get < tuple_index< result, typename std:: decay < tuple > :: type > :: value >
( std:: forward < tuple > ( t ) ) ;
}
std:: tuple < int , double > x;
double y = get_or< double , void * > ( x ) ;
void * z = get_or< char , void * > ( x ) ;
I2luY2x1ZGUgPHV0aWxpdHk+CiNpbmNsdWRlIDx0dXBsZT4KCnRlbXBsYXRlPCB0eXBlbmFtZSBlbGVtLCB0eXBlbmFtZSB0dXAsIHN0ZDo6c2l6ZV90IG9mZnNldCA9IDAgPgpzdHJ1Y3QgdHVwbGVfaW5kZXgKICAgIDogc3RkOjppbnRlZ3JhbF9jb25zdGFudDwgc3RkOjpzaXplX3QsIG9mZnNldCA+IHt9OwoKdGVtcGxhdGU8IHR5cGVuYW1lIGVsZW0sIHR5cGVuYW1lIGhlYWQsIHR5cGVuYW1lIC4uLiB0YWlsLCBzdGQ6OnNpemVfdCBvZmZzZXQgPgpzdHJ1Y3QgdHVwbGVfaW5kZXg8IGVsZW0sIHN0ZDo6dHVwbGU8IGhlYWQsIHRhaWwgLi4uID4sIG9mZnNldCA+CiAgICA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8IHN0ZDo6c2l6ZV90LCB0dXBsZV9pbmRleDwgZWxlbSwgc3RkOjp0dXBsZTwgdGFpbCAuLi4gPiwgb2Zmc2V0ICsgMSA+Ojp2YWx1ZSA+IHt9OwoKdGVtcGxhdGU8IHR5cGVuYW1lIGVsZW0sIHR5cGVuYW1lIC4uLiB0YWlsLCBzdGQ6OnNpemVfdCBvZmZzZXQgPgpzdHJ1Y3QgdHVwbGVfaW5kZXg8IGVsZW0sIHN0ZDo6dHVwbGU8IGVsZW0sIHRhaWwgLi4uID4sIG9mZnNldCA+CiAgICA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8IHN0ZDo6c2l6ZV90LCBvZmZzZXQgPiB7fTsKCnRlbXBsYXRlPCB0eXBlbmFtZSByZXN1bHQsIHR5cGVuYW1lIGZhbGxiYWNrLCB0eXBlbmFtZSB0dXBsZSA+CnR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCB0dXBsZV9pbmRleDwgcmVzdWx0LCB0eXBlbmFtZSBzdGQ6OmRlY2F5PCB0dXBsZSA+Ojp0eXBlID46OnZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICA9PSBzdGQ6OnR1cGxlX3NpemU8IHR5cGVuYW1lIHN0ZDo6ZGVjYXk8IHR1cGxlID46OnR5cGUgPjo6dmFsdWUsCiAgICBmYWxsYmFjayA+Ojp0eXBlCmdldF9vciggdHVwbGUgJiYgdCApIHsgcmV0dXJuIHt9OyB9Cgp0ZW1wbGF0ZTwgdHlwZW5hbWUgcmVzdWx0LCB0eXBlbmFtZSBmYWxsYmFjaywgdHlwZW5hbWUgdHVwbGUgPgp0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwgdHVwbGVfaW5kZXg8IHJlc3VsdCwgdHlwZW5hbWUgc3RkOjpkZWNheTwgdHVwbGUgPjo6dHlwZSA+Ojp2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgIT0gc3RkOjp0dXBsZV9zaXplPCB0eXBlbmFtZSBzdGQ6OmRlY2F5PCB0dXBsZSA+Ojp0eXBlID46OnZhbHVlLAogICAgcmVzdWx0ID46OnR5cGUKZ2V0X29yKCB0dXBsZSAmJiB0ICkgewogICAgcmV0dXJuIHN0ZDo6Z2V0PCB0dXBsZV9pbmRleDwgcmVzdWx0LCB0eXBlbmFtZSBzdGQ6OmRlY2F5PCB0dXBsZSA+Ojp0eXBlID46OnZhbHVlID4KICAgICAgICAoIHN0ZDo6Zm9yd2FyZDwgdHVwbGUgPiggdCApICk7Cn0KICAgIApzdGQ6OnR1cGxlPCBpbnQsIGRvdWJsZSA+IHg7CmRvdWJsZSB5ID0gZ2V0X29yPCBkb3VibGUsIHZvaWQgKiA+KCB4ICk7CnZvaWQgKnogPSBnZXRfb3I8IGNoYXIsIHZvaWQgKiA+KCB4ICk7Cg==