Argument S to typeof is not an expression
Dicebot
m.strashun at gmail.com
Wed May 8 05:31:38 PDT 2013
On Tuesday, 7 May 2013 at 15:05:40 UTC, Meta wrote:
> This is a little test to see if I can wrap types in structs and
> do some checking at compile time. For example, statically
> verifying in opAdd that neither number being added is negative.
> I
> added in the pragma to see what T's type is because I had the
> example compiling before, but two S structs added together was
> giving a result of void, and I was trying to figure out why that
> was happening.
To sum up short: you can't. Not because of D limitations but for
unfortunate reason magic does not really work in our world. You
can't check at compile-time data that is known only at run-time
and function body can't possibly know anything about caller. It
can be called from anywhere by anyone.
However, if you only want to allow opAdd to accept data known at
compile-time, you can either move it to template argument or just
make a run-time check and execute whole function with CTFE. That
is most likely reason your snippet has worked for a simpler code
- CTFE kicked in and everything including function body was
completely evaluated at compile-time.
But no, you can't possibly check function argument at
compile-time, not without extra restrictions. Better approach may
be enforcing restriction into the type system by defining some
NonNegativeInt user type that implements semantics you want. But
even then it will need some sort of run-time check in
constructor, important benefit is that it only needs to be run
once upon boxing.
Make your choices and I am ready to help :)
More information about the Digitalmars-d-learn
mailing list