On Saturday, 4 August 2012 at 03:07:21 UTC, Era Scarecrow wrote:
This can't work in general. What should such a function
return? The fully qualified name, I.e. including packages and
modules? What is if the referred to entity is a nested
function/local variable? What is if it is defined in a module
which is not imported in the place where the string is mixed
in?
I would think, the exact 'text' of the way the variable was
called, in my example it would be "inum.i", and since it would
be at the local level (where the mixin was called) it should
have access to everything that it did at that time.
How do you determine what the »local level« is? A string mixin
isn't something you can »call«, just a compile-time constant
string, which can be »evaluated« in a completely different
place than it can be constructed. Maybe some heuristic could be
used, but it's not worth the trouble, in my opinion.
True I can add asserts as part of the output code, but as
mentioned hopefully the constraints could do that work, plus
adding extra checks as part of a mixin seems a little...
excessive, dirty and ugly.
Why would it be dirty? String mixins are just compile-time code
generation. Also, using template constraints has almost zero
benefits if overload resolution is not involved anyway –
remember, this is just about the helper function/template
generating the string to be mixed in.
Then doesn't it seem like we're missing a potentially
important piece of the puzzle for mixins and templates? very
likely my modified template will include you including the same
variable twice, but if someone gets lazy then it may not work.
As I said, there are almost always ways to achieve what you want
without resorting to getting the string representation of an
alias parameter. For example:
---
mixin template BitfieldsOn(alias target, <…>) if
(isIntegral!(typeof(target))) {
mixin({
string code;
// Generate code using "target" as identifier.
return code;
}());
}
mixin BitfieldsOn!(foo, <…>);
---
David