...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
Front Page / Tutorial: Metafunctions and Higher-Order Metaprogramming / Handling Placeholders |
Our implementation of twice already works with metafunction classes. Ideally, we would like it to work with placeholder expressions too, much the same as mpl::transform allows us to pass either form. For example, we would like to be able to write:
template <class X> struct two_pointers : twice<boost::add_pointer<_1>, X> {};
But when we look at the implementation of boost::add_pointer, it becomes clear that the current definition of twice can't work that way.
template <class T> struct add_pointer { typedef T* type; };
To be invokable by twice, boost::add_pointer<_1> would have to be a metafunction class, along the lines of add_pointer_f. Instead, it's just a nullary metafunction returning the almost senseless type _1*. Any attempt to use two_pointers will fail when apply1 reaches for a nested ::apply metafunction in boost::add_pointer<_1> and finds that it doesn't exist.
We've determined that we don't get the behavior we want automatically, so what next? Since mpl::transform can do this sort of thing, there ought to be a way for us to do it too — and so there is.