转发包含不可复制类型的可变参数 void print1(Args…(Args Args){ print2(args); } 无效打印2(Args…)(Args Args){ //做点什么 }

转发包含不可复制类型的可变参数 void print1(Args…(Args Args){ print2(args); } 无效打印2(Args…)(Args Args){ //做点什么 },d,D,你可以这样称呼它 print1(1,2); 但是如果变量参数中存在不可复制的类型呢 structfoo{ @禁用此(此); ~z~这个(){ } } 然后 print(1,2,Foo()); 错误:struct app.Foo不可复制,因为它带有@disable注释 这应该是可能的混合 void print1(Args…(Args Args){ mixin(前进!(print2,Args)); } 这将扩展到 //带有'print(1,2,Foo())` 无效打印1(Args…)(Arg

你可以这样称呼它

print1(1,2);
但是如果变量参数中存在不可复制的类型呢

structfoo{
@禁用此(此);
~z~这个(){
}
}
然后

print(1,2,Foo());
错误:struct app.Foo不可复制,因为它带有@disable注释

这应该是可能的混合

void print1(Args…(Args Args){
mixin(前进!(print2,Args));
}
这将扩展到

//带有'print(1,2,Foo())`
无效打印1(Args…)(Args Args){
mixin(“print2(args[0],args[1],args[2].move()”;
}

除此之外还有其他选择吗?类似的东西已经存在吗?

您的
print1
print2
函数正在按值接受函数参数,这意味着它们在传入时会被复制。当然,这不适用于不可复制的值(除非将其移入,否则会使源值无效)

要接受不可复制的值,您需要通过引用传递它们。使用可变模板最简单的方法是使用
auto-ref

void print1(Args...)(auto ref Args args) { ... }
使用
auto ref
,可以通过引用传递的任何参数都将被删除

您还可以将此功能与以下功能结合使用:

void print2(Args...)(auto ref Args args) { ... }
void print1(Args...)(Args args) {
    print2(forward!args);
}