What is parameter tuple actually?
Daniel Keep
daniel.keep.lists at gmail.com
Tue Oct 16 20:23:45 PDT 2007
Yang Bo wrote:
> on gdc, this code does not works:
Please do not say "does not work." That's incredible vague, and doesn't
give us any hints as to *why* something doesn't work. If you can, post
the output of the compiler.
> template TestLines(alias Line) {
> const char[] lineString = Line.stringof;
> const uint line = Line;
> }
>
> unittest{
> assert(TestLines!(__LINE__).lineString == __LINE__.stringof);
> assert(TestLines!(__LINE__).line == __LINE__);
> }
>
>
> But, if I use tuple instead, it works:
>
>
> template TestLines(Args...) {
> const char[] lineString = Args[0].stringof;
> const uint line = Args[0];
> }
>
> unittest{
> assert(TestLines!(__LINE__).lineString == __LINE__.stringof);
> assert(TestLines!(__LINE__).line == __LINE__);
> }
>
> I wonder why.
I suspect it's because __LINE__ isn't a symbol. __LINE__ is basically
replaced by the compiler with its value when it's read from the file (at
some stage), and I'll bet it's *before* templates are expanded. So in
the first instance, you've got:
TestLines!(11).lineString
Which won't work because you can't alias an expression. The second one
works because it's probably passing the value of __LINE__ as a constant
expression, not a symbol alias.
-- Daniel
More information about the Digitalmars-d
mailing list