Accessing __traits(identifier) for variadic function arguments

Salih Dincer salihdb at hotmail.com
Fri Oct 11 06:04:44 UTC 2024


On Friday, 11 October 2024 at 03:01:54 UTC, Alexa Schor wrote:
> Hello!
>
> I've been working on building some debug print functions and 
> have been using the `__traits(identifier, x)` to get the name 
> of parameters passed into a function, trying as best I can to 
> replicate the functionality of the useful C++ [`#` 
> operator](https://gcc.gnu.org/onlinedocs/cpp/Stringizing.html) 
> to turn a macro argument into a string literal.
>
> This works fine for a single aliased argument
>
> ```d
> void printName(alias val)() {
>     writeln(__traits(identifier, val));
> }
> ```
>
> but I wanted to see if I could get it working in a variadic 
> function. However, attempting with a static foreach, it seems 
> that the `__traits(identifier)` value is not preserved:
>
> ```d
> void printNames(T...)(T args) {
>     static foreach(val; args)
>         writeln(__traits(identifier, val));
> }
> ```
> Instead,
>
> ```d
> void main() {
>     float x = 123;
>     float y = 456;
>
>     printName!(x);
>     printName!(y);
>
>     printNames(x, y);
> }
>
> ```
>
> yields
>
> ```d
> x
> y
> __param_0
> __param_1
> ```
>
> *(I guess this makes sense, as it's no longer a aliased 
> template argument and now is a function argument, although I 
> thought I remember reading that variadic function arguments 
> were aliased?)*
>
> I suppose my question is: is there any way to determine the 
> original name of a value passed into a variadic function, in 
> the way that the `printName` function above does?
>
> I'm quite new to this language, so I very much apologize if 
> this question is ill-formed or based on incorrect assumptions. 
> I also realize this is a weird application, so I wouldn't be 
> too surprised if this just isn't possible, but I figured I'd 
> ask here.
>
> Thank you,
> Alexa

```d
import std.stdio, core.interpolation;
void show(Args...)(InterpolationHeader hdr, Args args, 
InterpolationFooter ftr)
{
   foreach (arg; args)
   {
     static if (is(typeof(arg) == InterpolatedExpression!code, 
string code))
       code.write;
     else static if (is(typeof(arg) == InterpolatedLiteral!str, 
string str))
       str.write;
     else write(" = ", arg);
   }
   writeln();
}

void main()
{
    int a = 5, b = 22;
    show(i`$(a), $(b), $(a + b)`);
    // a = 5, b = 22, a + b = 27
}
```
SDB at 79


More information about the Digitalmars-d-learn mailing list