In the original you are casting an int to a pointer type, which is legitimate (although rarely a good idea). The other side of the matter is simply precedence.cast(T)a.b;Is really the same as: cast(T)(a.b);
But this also means that the cast is useless there, so there is no compile-time binding, so no CRTP.
Anyway, it ws just a game to write the equivalent.