#include <type_traits>
#include <typeinfo>
#include <iostream>
struct tag1 {};
struct tag2 {};
// function declaration
std::true_type has_hoge(tag1);
std::false_type has_hoge(tag2);
template<bool cond, typename int_type>
struct convert;
template<typename int_type>
struct convert<true, int_type>
{
typedef typename std::make_signed<int_type>::type type;
};
template<typename int_type>
struct convert<false, int_type>
{
typedef typename std::make_unsigned<int_type>::type type;
};
// int
convert<decltype(has_hoge(tag1()))::type::value, int>::type int_hoge;
// unsigned int
convert<decltype(has_hoge(tag2()))::type::value, int>::type uint_hoge;
// コンパイルエラーになる。
template<typename tag, typename int_type>
struct hogehoge
{
typedef typename convert<decltype(has_hoge(tag()))::type::value, int_type>::type type;
};
// */
int main()
{
std::cout << std::is_same<hogehoge<tag2, int>::type, unsigned int>::value;
return 0;
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8dHlwZWluZm8+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnN0cnVjdCB0YWcxIHt9OwpzdHJ1Y3QgdGFnMiB7fTsKCi8vIGZ1bmN0aW9uIGRlY2xhcmF0aW9uCnN0ZDo6dHJ1ZV90eXBlIGhhc19ob2dlKHRhZzEpOwpzdGQ6OmZhbHNlX3R5cGUgaGFzX2hvZ2UodGFnMik7Cgp0ZW1wbGF0ZTxib29sIGNvbmQsIHR5cGVuYW1lICBpbnRfdHlwZT4Kc3RydWN0IGNvbnZlcnQ7Cgp0ZW1wbGF0ZTx0eXBlbmFtZSAgaW50X3R5cGU+CnN0cnVjdCBjb252ZXJ0PHRydWUsIGludF90eXBlPgp7Cgl0eXBlZGVmIHR5cGVuYW1lICBzdGQ6Om1ha2Vfc2lnbmVkPGludF90eXBlPjo6dHlwZSB0eXBlOwp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgIGludF90eXBlPgpzdHJ1Y3QgY29udmVydDxmYWxzZSwgaW50X3R5cGU+CnsKCXR5cGVkZWYgdHlwZW5hbWUgIHN0ZDo6bWFrZV91bnNpZ25lZDxpbnRfdHlwZT46OnR5cGUgdHlwZTsKfTsKCi8vIGludApjb252ZXJ0PGRlY2x0eXBlKGhhc19ob2dlKHRhZzEoKSkpOjp0eXBlOjp2YWx1ZSwgaW50Pjo6dHlwZSBpbnRfaG9nZTsKCi8vIHVuc2lnbmVkIGludApjb252ZXJ0PGRlY2x0eXBlKGhhc19ob2dlKHRhZzIoKSkpOjp0eXBlOjp2YWx1ZSwgaW50Pjo6dHlwZSB1aW50X2hvZ2U7CgovLyDjgrPjg7Pjg5HjgqTjg6vjgqjjg6njg7zjgavjgarjgovjgIIKdGVtcGxhdGU8dHlwZW5hbWUgdGFnLCB0eXBlbmFtZSBpbnRfdHlwZT4Kc3RydWN0IGhvZ2Vob2dlCnsKdHlwZWRlZiB0eXBlbmFtZSBjb252ZXJ0PGRlY2x0eXBlKGhhc19ob2dlKHRhZygpKSk6OnR5cGU6OnZhbHVlLCBpbnRfdHlwZT46OnR5cGUgdHlwZTsKfTsKLy8gKi8KCmludCBtYWluKCkKewogICAgc3RkOjpjb3V0IDw8IHN0ZDo6aXNfc2FtZTxob2dlaG9nZTx0YWcyLCBpbnQ+Ojp0eXBlLCB1bnNpZ25lZCBpbnQ+Ojp2YWx1ZTsKICAgIHJldHVybiAwOwp9Cg==