Compile-time type lists in C++