compile time 'address'

bauss jj_1337 at live.dk
Thu Nov 29 16:21:26 UTC 2018


On Thursday, 29 November 2018 at 15:56:54 UTC, Dominic Jones 
wrote:
> Hello,
>
> I would like to capture the "address" of variables at compile 
> time. Something not far from this can be done in C++, namely 
> addresses can be compared but not captured (then compared, or 
> whatever).
>
> I was hoping that it could be done in D, so I wrote something 
> similar to test. It seems that D is more restrictive than C++ 
> in this matter, as even comparison cannot be performed at 
> compile time, as far as I can tell.
>
> What I wish to do may in principle not be possible, but I am 
> not familiar enough with compilers to know for sure. Also, I am 
> not so familiar with D, so a better transliteration from the 
> C++ example maybe possible and yield something on par or better.
>
> The reason for wanting to do all this is to find some way of 
> 'baking in' the name of a variable (or some locally unique 
> identifier) into an expression tree node type, facilitating 
> certain expression tree transforms.
>
> The closest I can get to what I want makes use of mixins, but 
> is not ideal (https://run.dlang.io/is/Fr2b3f).
>
>
> C++ (at: https://godbolt.org/z/CLPzGq)
>
> template<typename T, typename U>
> auto constexpr cmp(T const &t, U const &u)
> {
> /* Preferable, but not possible:
>      auto constexpr ta = &t; // capture
>      auto constexpr ua = &u;
>      return ta == ua;
> */
>   return &t == &u;
> }
>
> int main()
> {
>   auto c0 = 1;
>   auto c1 = 2;
>
>   static_assert(cmp(c0, c0));
>   static_assert(!cmp(c0, c1));
> }
>
>
> D (at: https://run.dlang.io/is/rf5azp)
>
> auto cmp(T, U)(const ref T t, const ref U u)
> {
>   return &t == &u;
> }
>
> void main()
> {
>   auto c0 = 1;
>   auto c1 = 2;
>
>   // error: "variable c0 cannot be read at compile time"
>   static assert(cmp(c0, c0));
>   static assert(!cmp(c0, c1));
> }

Use enum instead of auto.


More information about the Digitalmars-d mailing list