Support custom separator, end characters, and Output Stream.
Support arbitrary number of arguments.
Support printing STL containers
Support printing the names of enumerations instead of their values.
Supporting types:
- fundamental types
- enum
- array
- STL sequence containers
- STL associative containers
- pair/tuple
- pointer
- unique_ptr
- shared_ptr
- __int128