My shallow response is that it also tells you to just have an accessor called `recipe()` which should be inlined [1] =).  (It also advises you not to overload operators which is ridiculous.) [1]

I understand that map's behavior is weird and undesirable.  However, you are cutting off a lot of functionality -- ie the `map<T, U>` API to prevent another developer from accidentally not writing robust code.  It is 1 - 3 lines for the developer to write the same kind of safety guard that you have here.  Right now the developer has no mechanism to iterating over the existing recipes.  Maybe I missed it.  I'd rather not redefine a healthy portion of map just to keep a member variable private.  

It just seems to me that you could have more features with less code by having these maps be public.  If you wanted to keep the Get/Add functions around too as the safe mechanism, that would be fine.  Though I think Add/ only serves to slow the program down in its present state.