and access is very simple, just obj_tables[ID], see if it's NULL, which means it doesn't exist.
That does not sound healthy. Using std::unordered_map the code would be the same you would use for a normal std::map:
auto it = myMap.find(key); if (it != myMap.end()) return it->second; else return nullptr;Just adding nullptr elements to the map (on every operator  call which does not have a (key, value)-pair yet) because the element does not exist yet sounds like a bad idea.
Whether a hash map is worth the bother at all will also depend both on the number of elements you expect to deal with as well as the expected access patterns.