#include <iostream>
using namespace std;
template <template <typename, typename...> typename trait_t, typename arg_t>
struct BindFirst
{
template <typename... arg_ts>
using result_t = trait_t<arg_t, arg_ts...>;
};
template <typename... Args>
using IsDouble = BindFirst<std::is_same, double>::result_t<Args...>;
template <typename T>
template <typename U>
using IsSameAs = std::is_same<T, U>;
template <typename T>
using IsDouble2 = IsSameAs<double>;
int main()
{
std::cout << IsDouble<int>::value << std::endl;
std::cout << IsDouble<double>::value << std::endl;
std::cout << IsDouble2<int>::value << std::endl;
std::cout << IsDouble2<double>::value << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUuLi4+IHR5cGVuYW1lIHRyYWl0X3QsIHR5cGVuYW1lIGFyZ190PgpzdHJ1Y3QgQmluZEZpcnN0CnsKICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gYXJnX3RzPgogIHVzaW5nIHJlc3VsdF90ID0gdHJhaXRfdDxhcmdfdCwgYXJnX3RzLi4uPjsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzPgp1c2luZyBJc0RvdWJsZSA9IEJpbmRGaXJzdDxzdGQ6OmlzX3NhbWUsIGRvdWJsZT46OnJlc3VsdF90PEFyZ3MuLi4+OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnRlbXBsYXRlIDx0eXBlbmFtZSBVPgp1c2luZyBJc1NhbWVBcyA9IHN0ZDo6aXNfc2FtZTxULCBVPjsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgp1c2luZyBJc0RvdWJsZTIgPSBJc1NhbWVBczxkb3VibGU+OwoKaW50IG1haW4oKQp7CiAgc3RkOjpjb3V0IDw8IElzRG91YmxlPGludD46OnZhbHVlIDw8IHN0ZDo6ZW5kbDsKICBzdGQ6OmNvdXQgPDwgSXNEb3VibGU8ZG91YmxlPjo6dmFsdWUgPDwgc3RkOjplbmRsOwogIAogIHN0ZDo6Y291dCA8PCBJc0RvdWJsZTI8aW50Pjo6dmFsdWUgPDwgc3RkOjplbmRsOwogIHN0ZDo6Y291dCA8PCBJc0RvdWJsZTI8ZG91YmxlPjo6dmFsdWUgPDwgc3RkOjplbmRsOwoKICByZXR1cm4gMDsKfQ==