Determine at compile time whether or not an alias is defined in a struct/class

Steven Schveighoffer schveiguy at yahoo.com
Sun Dec 31 15:41:43 UTC 2017


On 12/31/17 10:01 AM, ktoast wrote:
> Hello everyone,
> 
> 
> I started to learn D a few weeks ago and have been stuck trying to solve 
> the following problem :
> 
> - determine at compile time whether an alias is defined or not in a 
> struct/class.
> 
> You'll find my attempt thereafter, something similar to how it's done in 
> C++ (using the type void_t and partial specialization of a templated 
> struct) :
> 
> 
> 
> alias void_t(T) = void;
> 
> struct define_default_type(T) {
> 
>      static struct test(U, V = void) {
>          static const bool value = false;
>      }
> 
>      static struct test(U, V : void_t!(U.default_type)) {
>          static const bool value = true;
>      }
> 
>      static const bool value = test!(T).value;
> }
> 
> unittest {
> 
>      struct S {
>          alias default_type = void;
>      }
> 
>     assert(define_default_type!S.value); //define_default_type!S.value 
> is false, not sure why
> }
> 
> 
> 
> I can't tell what's wrong with the code above or if this is even the 
> right way to go about it with D.
> 
> Would anyone have pointers to give me on how to solve this ?
> 
> Thanks a lot !
> 

hm... what it looks like you are trying to do is find out if the struct 
has a member default_type, and if it is an alias to a type? It's hard to 
tell because of your C++-like attempt :)

This is how I would do it:

enum define_default_type(S) = is(S.default_type);

an isexpression has a lot of power: 
https://dlang.org/spec/expression.html#IsExpression

The default iexpression just returns true if the given symbol is a type.

So now:

assert(define_default_type!S);

or even better:

static assert(define_default_type!S); // check at compile-time

See if it fits your needs.

If it doesn't do quite what you want, there are a lot of goodies here: 
https://dlang.org/spec/traits.html

and here: https://dlang.org/phobos/std_traits.html

-Steve


More information about the Digitalmars-d-learn mailing list