#include <type_traits>
#include <iostream>
template <typename... Ts>
struct TypeList;
template <>
struct TypeList<>
{
static const int size = 0;
static std::integral_constant<int, -1> indexOf(...);
};
template <typename Head, typename... Tail>
struct TypeList<Head, Tail...> : TypeList<Tail...>
{
static const int size = sizeof...(Tail) + 1;
static std::integral_constant<int, sizeof...(Tail)> indexOf(Head&&);
using TypeList<Tail...>::indexOf;
};
template <typename TypeList, typename T>
using IndexOf = std::integral_constant<int,
TypeList::size - decltype(TypeList::indexOf(std::declval<T>()))::value - 1>;
struct Type00 { };
struct Type01 { };
struct Type02 { };
struct Type03 { };
struct TypeXX { };
struct TypeYY { };
using MyTypeList = TypeList<
Type00,
Type01,
Type02,
Type03,
TypeXX,
TypeYY
>;
int main()
{
std::cout << IndexOf<MyTypeList, Type00>::value
<< IndexOf<MyTypeList, Type01>::value
<< IndexOf<MyTypeList, Type02>::value
<< IndexOf<MyTypeList, Type03>::value
<< IndexOf<MyTypeList, TypeXX>::value
<< IndexOf<MyTypeList, TypeYY>::value;
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVHM+CnN0cnVjdCBUeXBlTGlzdDsKCnRlbXBsYXRlIDw+CnN0cnVjdCBUeXBlTGlzdDw+CnsKICAgIHN0YXRpYyBjb25zdCBpbnQgc2l6ZSA9IDA7CiAgICBzdGF0aWMgc3RkOjppbnRlZ3JhbF9jb25zdGFudDxpbnQsIC0xPiBpbmRleE9mKC4uLik7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgSGVhZCwgdHlwZW5hbWUuLi4gVGFpbD4Kc3RydWN0IFR5cGVMaXN0PEhlYWQsIFRhaWwuLi4+IDogVHlwZUxpc3Q8VGFpbC4uLj4KewogICAgc3RhdGljIGNvbnN0IGludCBzaXplID0gc2l6ZW9mLi4uKFRhaWwpICsgMTsKICAgIHN0YXRpYyBzdGQ6OmludGVncmFsX2NvbnN0YW50PGludCwgc2l6ZW9mLi4uKFRhaWwpPiBpbmRleE9mKEhlYWQmJik7CiAgICB1c2luZyBUeXBlTGlzdDxUYWlsLi4uPjo6aW5kZXhPZjsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlTGlzdCwgdHlwZW5hbWUgVD4KdXNpbmcgSW5kZXhPZiA9IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8aW50LAogICAgVHlwZUxpc3Q6OnNpemUgLSBkZWNsdHlwZShUeXBlTGlzdDo6aW5kZXhPZihzdGQ6OmRlY2x2YWw8VD4oKSkpOjp2YWx1ZSAtIDE+OwoKc3RydWN0IFR5cGUwMCB7IH07CnN0cnVjdCBUeXBlMDEgeyB9OwpzdHJ1Y3QgVHlwZTAyIHsgfTsKc3RydWN0IFR5cGUwMyB7IH07CnN0cnVjdCBUeXBlWFggeyB9OwpzdHJ1Y3QgVHlwZVlZIHsgfTsKCnVzaW5nIE15VHlwZUxpc3QgPSBUeXBlTGlzdDwKICAgIFR5cGUwMCwKICAgIFR5cGUwMSwKICAgIFR5cGUwMiwKICAgIFR5cGUwMywKICAgIFR5cGVYWCwKICAgIFR5cGVZWQo+OwoKaW50IG1haW4oKQp7CiAgICBzdGQ6OmNvdXQgPDwgSW5kZXhPZjxNeVR5cGVMaXN0LCBUeXBlMDA+Ojp2YWx1ZQogICAgICAgICAgICAgIDw8IEluZGV4T2Y8TXlUeXBlTGlzdCwgVHlwZTAxPjo6dmFsdWUKICAgICAgICAgICAgICA8PCBJbmRleE9mPE15VHlwZUxpc3QsIFR5cGUwMj46OnZhbHVlCiAgICAgICAgICAgICAgPDwgSW5kZXhPZjxNeVR5cGVMaXN0LCBUeXBlMDM+Ojp2YWx1ZQogICAgICAgICAgICAgIDw8IEluZGV4T2Y8TXlUeXBlTGlzdCwgVHlwZVhYPjo6dmFsdWUKICAgICAgICAgICAgICA8PCBJbmRleE9mPE15VHlwZUxpc3QsIFR5cGVZWT46OnZhbHVlOwp9