this requires c++11 - will need to look for alternative way to hash a type