Boost logo

Boost :

Subject: Re: [boost] A proposal for the creation of a new module, Core Type Traits
From: Stephen Kelly (hello_at_[hidden])
Date: 2015-01-09 13:41:19

John Maddock wrote:

>>> there's an opportunity here to remove all that obfuscation and crud and
>>> produce something that's actually halfway readable and maintainable.
>> Just on the topic of maintenance:
>> A C++17 style voider works with GCC 3.2 and later, VS8 and later and
>> various HP aCC, Sun Studio, Intel and other compilers listed here:
>> Only VS 7.1 chokes on it.
> What's a C++ 17 style voider?


Even if using VS8, GCC3.2 etc you can still do this:

struct voider { typedef void type; };

struct true_type
  enum { value = true };
struct false_type
  enum { value = false };

template<typename T, typename = void>
struct HasSecondType : false_type {};

template<typename T>
struct HasSecondType<T,
    typename voider<typename T::second_type>::type> : true_type {};

template<typename T, T>
struct PointerHelper {};

template<typename T, typename = void>
struct HasSomeMemberFunc : false_type {};

template<typename T>
struct HasSomeMemberFunc<T,
    typename voider<PointerHelper<int(T::*)(int), &T::somemember> >::type> :
true_type {};

template<typename T, typename = void>
struct HasSomeMemberData : false_type {};

template<typename T>
struct HasSomeMemberData<T,
    typename voider<PointerHelper<double T::*, &T::data> >::type> :
true_type {};

struct A
  int somemember(int);
  int somemember(double);

  double data;

struct B
  int data;
  double otherData;

template<bool b>
class myStaticAssert;

class myStaticAssert<true> {};

#define My_Join(A, B) My_Joiner(A, B)
#define My_Joiner(A, B) A ## B

#define My_StaticAssert(cond, message) \
  enum {My_Join(assert, __LINE__) = sizeof(myStaticAssert<cond>)};

My_StaticAssert(HasSomeMemberFunc<A>::value, "");
My_StaticAssert(!HasSomeMemberFunc<B>::value, "");
My_StaticAssert(HasSomeMemberData<A>::value, "");
My_StaticAssert(!HasSomeMemberData<B>::value, "");

I'll leave it as an excercise for you to macro-ize the HasSomeMemberData etc



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