Scott Meyers
10 Cool Things in C++ -- Plus Something Wicked
What follows is a slightly-sanitized copy of the notes I used for my "10 Cool Things in C++ -- Plus Something Wicked" talk I gave at Software Development in 1997. Questions? Comments? Suggestions? Feel free to send me mail. Scott smeyers@aristeia.com http://www.aristeia.com What is a "cool" thing? Cool things should be novel, interesting, and useful in solving different types of problems; they typically reveal insights into novel applications of language features. Ideally, they're all three (novel, interesting, useful), but a very heavy weighting in one category alone suffices. For example, a technique with no utility but great novelty and interest can qualify, just as useless -- but interesting -- art can qualify as being "cool." - Barton's/Nackman's Dimensional Analysis John J. Barton and Lee R. Nackman, "Dimensional analysis," C++ Report, January 1995. Based on section 16.5 of their "Scientific and Engineering C++: An Introduction with Advanced Techniques and Examples," Addison-Wesley, 1994. - Double Application Of Smart Pointers Can be used to automate thread control in non-thread-safe classes, though Stroustrup's comments on pp. 464-5 in his C++PL/2E indicate that using this technique for concurrency control may be counterproductive. Care must be taken to ensure a thread doesn't block itself. Can also be used to confirm class invarients before and after calls. Is there a way to extend it to checking function precondition/postconditions? This posting shows the same idea, though I originally got the idea from Tony Davis based on a class he taught. [ Begin Posting ] Newsgroups: comp.lang.c++ From: jimad@microsoft.com (Jim ADCOCK) Subject: Re: A really good way to do this is? Date: 13 Apr 92 20:57:16 GMT |The problem at hand is I'd like to be able to define a general |class which I can inherit from that has a the following property: |each time a member function is called a hidden member function, |eg. an access function, is called and when the member function |exits a `deaccess' function is called. This is similar to, but not |really the same, as the constructor/destructor pair for an |object, but I wish for it to happen on each access. I don't believe C++ offers a "good" solution to this problem [although adding operator dot would be a partial set in the right direction] See the below "not-too-good" example which illustrates some of the issues and associated problems: class X; class dispatch { X& xref; public: dispatch(X& x); ~dispatch(); X* operator->(); }; class X { char name; public: X(char c) : name(c) { } void doSomething() { printf("doSomething with %c\n", int(name)); } void lock() { printf("lock %c\n", name); } void unlock() { printf("unlock %c\n", name); } dispatch operator->() { return *this; } }; dispatch::dispatch(X& x) : xref(x) { xref.lock(); } dispatch::~dispatch() { xref.unlock(); } X* dispatch::operator->() { return &xref; } main() { X x('x'); printf("++++++\n"); x->doSomething(); printf("------\n"); x.doSomething(); return 0; } [ End Posting ] - Coplien's Reading Of Network Objects James O. Coplien, "Advanced C++: Programming Styles and Idioms," Addison-Wesley, 1992, pp. 148-159. - Detlef's Discriminated Unions See discriminated-unions.txt. - Koenig's/Moo's Function Composition Andrew Koenig and Barbara Moo, "Ruminations on C++," Addison-Wesley, 1997, chapter 21. - Traits Nathan Myers, "A New and Useful Template Technique: Traits," C++ Report, June 1995, also available at http://www.cantrip.org/traits.html; Klaus Kreft and Angelika Langer, "Iterators in the Standard Library," C++ Report, November-December 1996; Pete Becker, "Questions and Answers: Traits to the Rescue," C/C++ Users Journal, November 1996. Traits are basically compile-time else-if-thens: the unspecialized template is the else clause, the specializations are the if clauses. I think traits can be used to determine whether a template parameter is a built-in type. Also whether a template parameter inherits from a given base class. The trick is to create a template generating code that won't compile, then provide specializations that *will* compile for the special cases that are allowed. Did Myers invent this? - Template Metaprogramming and Expression Templates Todd Veldhuizen, "Using C++ template metaprograms," C++ Report, May 1995; Todd Veldhuizen, "Expression templates," C++ Report, June 1995; Todd Veldhuizen and Kumaraswamy Ponnambalam, "Linear Algebra with C++ Template Metaprograms," Dr. Dobb's Journal, August 1996. See the Blitz Project home page, http://monet.uwaterloo.ca/blitz/. Apparently discovered independently by Todd Veldhuizen and Daveed Vandevorde (the latter of whom apparently called it "static expressin trees" and who used it in the implementation of his valarray template (available at http://www.cs.rpi.edu/pub/vandevod/Valarray/)). Has other applications, e.g., Carlo Pescio's "Binary Constants Using Template Metaprogramming," C/C++ Users Journal, February 1997. - Skaller's Use Of A Local Class In Class Factories See my notes on mixins, but check this first: don't all class names have external linkage? - Hickey's Callbacks. Rich Hickey, "Callbacks in C++ Using Template Functors," C++ Report, February 1995. Article and code available at his home page, http://ourworld.compuserve.com/homepages/RichHickey/. See also callback.txt file in C++ directory. - Fujinami's Run-Time Code Generation Nobuhisa Fujinami, "Automatic Run-Time Code Generation in Object-Oriented Languages," submitted to COOTS 97. Available in postscript at http://www.aristeia.com/fujinami.ps. - Ted Clancy's implementation (which turns out to be MY implementation) of a NULL object via member templates for type conversions. - The GOF's Visitor Pattern Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides, "Design Patterns: Elements of Reusable Object-Oriented Software," Addison-Wesley, 1995, pp 331-344. See also John Vlissides' article in the September 1996 C++ Report. It describes an extension to Visitor that relaxes the restriction that the initial hierarchy be unmodifiable. See also below on the wicked thing. - The Standard Template Library David R. Musser and Atul Saini, "STL Tutorial and Reference Guide," Addison-Wesley, 1996. There are lots of on-line resources -- a good place to start is http://www.sgi.com/Technology/STL/. The wicked thing: - Lakos' Long-Distance Friendship Hole John Lakos, "Large-Scale Software Design," Addison-Wesley, 1996, section 3.6.2. Why did this give me the same "cool" kind of feeling as the above ideas, even though it's wicked? Could it be for the same reason that psychology tells us we sometimes confuse fear and passion: the physiological effects are similar? (An "emotional illusion.") Danger and exhileration are linked in our minds. If we let f(n) = "Friday the 13th, Part n", can we infer that the reason behind the success of the series is that the limit of f(n) as n goes to infinity is love? Maybe that's why this is such a popular series with the teenage set: get them scared enough, and they'll think they like you :-). [The preceding is not supposed to be philosophical, it's supposed to be funnily tongue in cheek.] One "cool" aspect of long-distance friendship is that it solves the problem introduced by the Visitor pattern: Visitors are fake virtual functions, but they have no more than public access to the objects they're acting virtual on. LDF also solves a similar problem with the fake-vtbl solution to the double-dispatching problem.

