On Wed, Mar 6, 2013 at 11:36 AM, Stefan Strasser
Hi everyone,
are there any guidelines for boost libraries on when to use traits classes and when to use a metafunction for each member of a would-be traits class?
I'd say use your best judgment. I've seen both in boost libraries. c++11 uses traits classes
(iterator_traits, pointer traits, ...), but Abrahams and Gurtovoy [1] argue that traits classes ("traits blobs") should be avoided "at all costs" because they are an unnecessary concatenation of multiple metafunctions into one metafunction with multiple return values.
in practice, this means that if a single 'traits class member' aka 'metafunction result' ought to differ from the defaults, the entire traits class has to be reimplemented by the user, not only the metafunction whose result ought to differ from the default.
One way to mitigate that is to provide a standard, default implementation of the traits class from which specializations can inherit and override only that which is needed. on the other hand, asking a user to implement 5 or more metafunctions is
much more tedious than implementing a traits class.
Agreed. If this is a likely scenario, I'd think an interface that allows you to specialize a traits class should at least be considered. [...] - Jeff