Passing variadic template parameters AND default call site __FILE__, __LINE__ template parameters.

monkyyy crazymonkyyy at gmail.com
Tue May 27 15:01:38 UTC 2025


On Tuesday, 27 May 2025 at 10:20:40 UTC, realhet wrote:
> Hello,
>
> ```d
> template T1(string FILE=__FILE__, size_t LINE=__LINE__, A...)
> {
> enum T1 = FILE ~ LINE.text ~ A.text;
> }
>
> pragma(msg, T1!(__FILE__,__LINE__, "hello", " world")); //works
> pragma(msg, T1!(__FILE__,__LINE__,i"Hello $("World")")); //works
> pragma(msg, T1!(i"Hello $("World")")); //error: does not match 
> template declaration `T1(string FILE = __FILE__, ulong LINE = 
> __LINE__, A...)`
> ```
>
> After "A..." I can't put anything, so it seems it is impossible 
> to combine the two superpowers: call site evaluation and 
> variadic template parameters.
>
> I can do similar functionality by function evaluation, but not 
> with template instantiation.
> Is there a way to do this functionality?

```d
import std;
template T2(string FILE=__FILE__, size_t LINE=__LINE__){
template T2(A...){
	alias T2=T1!(FILE,LINE,A);
}}
template T1(string FILE=__FILE__, size_t LINE=__LINE__,A...){
	enum T1 = FILE ~ LINE.text ~ A.text;
}
alias t2=T2!();
pragma(msg, t2!(i"Hello $("World")"));


/*
import std;
void main(){
	foreach(i;0..8){
		"alias a".write;
		i.write;
		"=void,".write;
}}
*/
template T3(alias a0=void,alias a1=void,alias a2=void,alias 
a3=void,alias a4=void,alias a5=void,alias a6=void,alias 
a7=void,string FILE=__FILE__, size_t LINE=__LINE__){
	alias A=AliasSeq!();
	static foreach(int I;0..8){
		alias B(int J:I)=mixin("a"~I.stringof);
		static if( ! is(B!I==void)){
			A=AliasSeq!(A,B!I);
	}}
	alias T3=T1!(FILE,LINE,A);
}

pragma(msg, T3!(i"goodbye $("World")"));


template pack(A...){
	alias unpack=A;
}
alias T4(alias A,string FILE=__FILE__, size_t 
LINE=__LINE__)=T1!(FILE,LINE,A.unpack);
pragma(msg, T4!(pack!(i"farwell $("World")")));
```


More information about the Digitalmars-d-learn mailing list