Many compilers contain a "single-inheritance" EBO. That is, they will allocate an empty base at the same address as a data member, but they will never allocate two bases at the same address. On these compilers, our storage implementation is suboptimal for the case where F and G are both empty. Patch storage to avoid this pitfall when NO_MI_EBO is defined in the preprocessor.
What happens to our compose template when F and G are the same empty class? How would you fix the problem? Write a test that fails with identical empty F and G, then fix compose_fg so that the test passes.
We may not be able to compose arbitrary function objects with compose_fg2, but we can use it to compose statically initialized function objects. (Hint: Review the list at the beginning of section 9.6 of types that can be passed as template arguments). Compile a small program that does so and, if you can read your compiler's assembly-language output, analyze the efficiency of the resulting code.
Write a generalized iterator template that uses type erasure to wrap an arbitrary iterator type and present it with a runtime-polymorphic interface. The template should accept the iterator's value_type as its first parameter and its iterator_category as the second parameter. (Hint 1: Use Boost's iterator_facade template to make writing the iterator easier. Hint 2: You can control whether a given member function is virtual by using structure selection.)
Change the sum overload example in section 9.9 so that it can add the arithmetic innermost elements of arbitrarily nested containers such as std::list<std::list<std:: vector<int> > >. Test your changes to show that they work.
Revisit the dimensional analysis code in Chapter 3. Instead of using BOOST_STATIC_ASSERT to detect dimension conflicts within operator+ and operator-, apply SFINAE to eliminate inappropriate combinations of parameters from the overload sets for those operators. Compare the error messages you get when misusing operator+ and operator- in both cases.