转发包含不可复制类型的可变参数 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);
}