template struct Pair { }; template class List { }; template struct Lookup; template struct Lookup, Ts...>> { static int const value = Lookup>::value; }; template struct Lookup, Ts...>> { static int const value = N; }; int main() { using My_List = List, Pair, Pair>; static_assert(Lookup::value == 3); static_assert(Lookup::value == -4); static_assert(Lookup::value == 12); }