compile-time detection of all pointer types in one test
    Andy 
    andy.pj.hanson at gmail.com
       
    Sun Jun 11 21:32:11 UTC 2023
    
    
  
On Sunday, 11 June 2023 at 21:25:21 UTC, DLearner wrote:
> Please consider:
> ```
> void main() {
>
>    import std.stdio;
>
>    struct foo {
>
>       int  foo1;
>       char foo2;
>    }
>    foo*   fooptr;
>
>    void*  genptr;
>
>
>    static if (is(typeof(fooptr) == void*))
>              writeln("fooptr is void*");
>           else
>              writeln("fooptr is not void*");
>
>    static if (is(typeof(fooptr) == foo*))
>              writeln("fooptr is foo*");
>           else
>              writeln("fooptr is not foo*");
>
>    static if (is(typeof(genptr) == void*))
>              writeln("genptr is void*");
>           else
>              writeln("genptr is not void*");
> }
> ```
> which produces:
> ```
> fooptr is not void*
> fooptr is foo*
> genptr is void*
> ```
>
> Since `void*` variables accept _all_ pointer types, I expected 
> to see `fooptr is void*`.
>
> Is there any way of picking up, at compile-time, all pointer 
> types in one test?
Use an `is` expression with a parameter list 
(https://dlang.org/spec/expression.html#is-parameter-list):
     void main() {
     	import std.stdio;
     	struct foo {}
     	foo* fooptr;
     	static if (is(typeof(fooptr) == T*, T))
     		writeln("fooptr is a pointer to a ", T.stringof);
     	else
     		writeln("fooptr is not a pointer");
     }
As a bonus, you can make use of the pointee type `T`.
    
    
More information about the Digitalmars-d-learn
mailing list