
On 7/10/06 4:52 PM, "Peter Dimov" <pdimov@mmltd.net> wrote:
Daryle Walker wrote:
Looking at <http://www.boost.org/libs/smart_ptr/shared_ptr.htm>, i.e. the Boost version, it seems that the authors fell into the "fake operator <" trap. If any of those authors are reading this, can you tell us why you added the fake operator instead of a custom-named comparison class?
shared_ptr defines operator< for map<shared_ptr<>, V> to work. What do you mean by "fake"?
I mean just what you did, defining such an operator _only_ to allow associative containers to use a default template argument, even if the operator doesn't fit the class's model otherwise. If we take your view to the extreme, then why should that template argument for comparison exist at all? We could always define an operator "<" and let associative containers use that. (Of course, such an action would forbid containers with the same key type but different comparison criteria.) What's wrong with defining a separate comparison class? Having to specify the class's name does not change the computation complexity, only your amount of typing (and you can use a typedef for multiple uses of the name). Typing a model involves not only what aspects to include, but what to exclude. Don't corrupt the model for convenience. Finally, using the comparison argument localizes the criteria. The whole operator "<" alternative makes the decision global, even for those that don't want/need it. I view the fake operator "<" as a code smell, and probably should be added to any official lists. -- Daryle Walker Mac, Internet, and Video Game Junkie darylew AT hotmail DOT com