#include<iostream>
#include<type_traits>
template <typename ...Ts>
struct types;
template <typename T, typename ...Ts>
struct types < T, Ts... > : public types<Ts...>
{
template <typename F, int i = 0>
struct find : public types<Ts...>::template find<F, i>
{
};
template <int i>
struct find < T, i > : public std::true_type
{
typedef T type;
};
};
template <>
struct types < >
{
template <typename F, int i = 0>
struct find : public std::false_type
{};
};
int main()
{
using namespace std;
cout << types<int, char>::find<int>::value << endl;
cout << types<int, char>::find<float>::value << endl;
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHR5cGVfdHJhaXRzPgoKdGVtcGxhdGUgPHR5cGVuYW1lIC4uLlRzPgpzdHJ1Y3QgdHlwZXM7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgLi4uVHM+CnN0cnVjdCB0eXBlcyA8IFQsIFRzLi4uID4gOiBwdWJsaWMgdHlwZXM8VHMuLi4+CnsKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGLCBpbnQgaSA9IDA+CglzdHJ1Y3QgZmluZCA6IHB1YmxpYyB0eXBlczxUcy4uLj46OnRlbXBsYXRlIGZpbmQ8RiwgaT4KCXsKCX07CgoJdGVtcGxhdGUgPGludCBpPgoJc3RydWN0IGZpbmQgPCBULCBpID4gOiBwdWJsaWMgc3RkOjp0cnVlX3R5cGUKCXsKCQl0eXBlZGVmIFQgdHlwZTsKCX07Cn07Cgp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgdHlwZXMgPCA+CnsKCXRlbXBsYXRlIDx0eXBlbmFtZSBGLCBpbnQgaSA9IDA+CglzdHJ1Y3QgZmluZCA6IHB1YmxpYyBzdGQ6OmZhbHNlX3R5cGUKCXt9Owp9OwoKCmludCBtYWluKCkKewogICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKICAgIGNvdXQgPDwgdHlwZXM8aW50LCBjaGFyPjo6ZmluZDxpbnQ+Ojp2YWx1ZSA8PCBlbmRsOwogICAgY291dCA8PCB0eXBlczxpbnQsIGNoYXI+OjpmaW5kPGZsb2F0Pjo6dmFsdWUgPDwgZW5kbDsKfQo=