Using C++ template parameters to create strong types
reliablecpp.com