El 14/01/2015 a las 20:58, John Maddock escribió:
I'm going to throw this out there to see what folks think:
In a branch called "Version2", see https://github.com/boostorg/type_traits/tree/Version2 is a partially rewritten type_traits lib: it doesn't yet contain all the traits of the old one, but there's a pretty good selection to test.
Very nice.
The main pros for this version are:
1) Zero dependencies other than Boost.Config.
We still have Boost.PP.
4) Substantially reduced #includes - the aim is that all files should include only what they need and no more - with what's needed determined by the actual implementation variant when appropriate. There were also a lot of spurious #includes left over from old workarounds no longer used.
For "is_function", you might test (I could help once things are
stabilized) another approach that could avoid the use of Boost.PP:
//For a function to pointer an lvalue of function type T
//can be implicitly converted to a prvalue
//pointer to that function. This does not apply to
//non-static member functions because lvalues
//that refer to non-static member functions do not exist.
template <class T>
struct is_reference_convertible_to_pointer
{
struct twochar { char dummy[2]; };
template <class U> static char test(U*);
template <class U> static twochar test(...);
static T& source();
static const bool value = sizeof(char) == sizeof(test<T>(source()));
};
//Filter out:
// - class types that might have implicit conversions
// - void (to avoid forming a reference to void later)
// - references (e.g.: filtering reference to functions)
// - nullptr_t (convertible to pointer)
template < class T
, bool Filter = is_class_or_union<T>::value ||
is_void<T>::value ||
is_reference<T>::value ||
is_nullptr_t<T>::value >
struct is_function_impl
{ static const bool value =
is_reference_convertible_to_pointer<T>::value; };
template <class T>
struct is_function_impl