Martin Sebor wrote: > >The implementation of Unary Traits (e.g., is_void) uses explicit >specialization on all four combinations of cv-qualifiers for each >trait (plain, const, volatile, and const volatile). I'm wondering >if the alternative approach of stripping the qualifiers before >"dispatching" to just one explicit specialization has been >considered.
That is what I had originally done. The following code may be eerily familiar to you. #include <tr1/_remove_cv.h> #include <rw/_defs.h> _RWSTD_NAMESPACE (__rw) { template <class _TypeT> struct __rw_is_void_impl { enum { _C_value = 0 }; }; _RWSTD_SPECIALIZED_CLASS struct __rw_is_void_impl<void> { enum { _C_value = 1 }; }; template <class _TypeT> struct __rw_is_void { enum { _C_value = __rw_is_void_impl< _TYPENAME __rw_remove_cv<_TypeT>::_C_type >::_C_value }; }; } // namespace __rw The only issue is that this creates a cyclic dependency between traits defined in <rw/_meta_cv.h> and those in <rw/_meta_cat.h>. An easy way to 'fix' this would be to forward declare __rw_remove_cv in <rw/_meta_cat.h> and then include <rw/_meta_cv.h> at the bottom, but this goes against our conventions. Another option was to put the remove-cv traits into their own header, but this went against your request to organize the traits in files according to some rationale. >The potential advantage of this approach is fewer >declarations, smaller translation units, and thus (presumably) >faster compilation. > There has to be a balance somewhere. If all traits are in one file, we have few includes, but lots of unnecessary declarations. If we spread them all out, then we have few unnecessary declarations, but many includes. Both can _potentially_ lead to (ever so slightly) longer compile times in some cases and shorter ones in other cases. I'm definitely open to suggestions and I'm willing to make any necessary changes. Unfortunately any suggestion has to take the following criteria into consideration... A. the number of trait headers should be kept to a minimum (to keep compile times down) B. there should not be many unnecessary declarations in any header (to keep compile times down) C. traits should be put into files according to some well defined rationale (to keep things organized) Unfortunately, I don't really see a clear path to satisfying all of the above requirements. >Martin >