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