Boost logo

Boost :

From: David Abrahams (dave_at_[hidden])
Date: 2003-11-11 07:39:09

Eric Friedman <ebf_at_[hidden]> writes:

>> At some point users need to learn to deal with the metafunction
>> idiom or we're going to be adding make_ to the beginning of every
>> metafunction name.
> I think there is an important difference between classes that are true
> metafunctions vs. those that are metafunctions only because of a lack
> of template typedefs.

Hmm: boost::type_with_alignment<N>::type

> That is, even if C++ today had template typedefs, I believe true
> metafunctions would not use the feature.
> [For instance, consider type traits and MPL algorithms. If these were
> template typedefs, then instantiation would occur immediately. This
> would prevent many good things, such as lambda expressions, etc. So
> even with the advent of template typedefs, I would hope true
> metafunctions would not use them.]
> On the other hand, if C++ had template typedefs, I would not want
> anyone to have to write:
> void f() {
> recursive_variant< ... >::type v;
> ...
> }

Why is lazy instantiation less useful for recursive_variant than for
other metafunctions?

> That recursive_variant is a metafunction is an implementation
> detail. Thus, it is a mistake, IMO, to expose this implementation
> detail to the user simply because of a deficiency in C++.
> In contrast, a name like 'make_recursive_variant' explicitly indicates
> a metafunction. Invoking this metafunction via ::type is no longer an
> implementation detail but rather integral to the metafunction idiom.

I understand your point.



Dave Abrahams
Boost Consulting

Boost list run by bdawes at, gregod at, cpdaniel at, john at