template <typename... List>
struct TypeList
{
enum
{
Length = sizeof...(List)
};
};
template <typename ToErase, typename... List>
struct Erase;
template <typename ToErase>
struct Erase<ToErase, TypeList<>>
{
typedef TypeList<> Result;
};
template <typename ToErase, typename... Head, typename... Tail>
struct Erase<ToErase, TypeList<Head..., ToErase, Tail...>>
{
typedef TypeList<Head..., Tail...> Result;
};
int main()
{
static_assert(Erase<double, TypeList<int, double, char>>::Result::Length == 2, "Did not erase double from TypeList<int, double, char>");
return 0;
}
dGVtcGxhdGUgPHR5cGVuYW1lLi4uIExpc3Q+CnN0cnVjdCBUeXBlTGlzdAp7CiAgICBlbnVtCgl7CgkgICAgTGVuZ3RoID0gc2l6ZW9mLi4uKExpc3QpCgl9Owp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFRvRXJhc2UsIHR5cGVuYW1lLi4uIExpc3Q+CnN0cnVjdCBFcmFzZTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUb0VyYXNlPgpzdHJ1Y3QgRXJhc2U8VG9FcmFzZSwgVHlwZUxpc3Q8Pj4KewogICAgdHlwZWRlZiBUeXBlTGlzdDw+IFJlc3VsdDsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUb0VyYXNlLCB0eXBlbmFtZS4uLiBIZWFkLCB0eXBlbmFtZS4uLiBUYWlsPgpzdHJ1Y3QgRXJhc2U8VG9FcmFzZSwgVHlwZUxpc3Q8SGVhZC4uLiwgVG9FcmFzZSwgVGFpbC4uLj4+CnsKCXR5cGVkZWYgVHlwZUxpc3Q8SGVhZC4uLiwgVGFpbC4uLj4gUmVzdWx0Owp9OwoKaW50IG1haW4oKQp7CiAgICBzdGF0aWNfYXNzZXJ0KEVyYXNlPGRvdWJsZSwgVHlwZUxpc3Q8aW50LCBkb3VibGUsIGNoYXI+Pjo6UmVzdWx0OjpMZW5ndGggPT0gMiwgIkRpZCBub3QgZXJhc2UgZG91YmxlIGZyb20gVHlwZUxpc3Q8aW50LCBkb3VibGUsIGNoYXI+Iik7CiAgICAKICAgIHJldHVybiAwOwp9
prog.cpp: In function ‘int main()’:
prog.cpp:27:63: error: ‘Erase<double, TypeList<int, double, char> >::Result’ has not been declared