On Tuesday, 27 May 2025 at 10:20:40 UTC, realhet wrote:
> Hello,
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?
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")")));