转发包含不可复制类型的可变参数
Forwarding variadic arguments containing non copyable types
void print1(Args...)(Args args){
print2(args);
}
void print2(Args...)(Args args){
//do something
}
你可以这样称呼它
print1(1, 2);
但是如果可变参数中有一个不可复制的类型怎么办?
struct Foo{
@disable this(this);
~this(){
}
}
然后
print(1, 2, Foo());
Error: struct app.Foo is not copyable because it is annotated with @disable
mixins 应该可以
void print1(Args...)(Args args){
mixin(forward!(print2, Args));
}
这将扩展到
// with `print(1, 2, Foo());`
void print1(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
,任何可以通过引用传递的参数都将是。
您也可以将其与 std.functional.forward
结合使用:
void print2(Args...)(auto ref Args args) { ... }
void print1(Args...)(Args args) {
print2(forward!args);
}
void print1(Args...)(Args args){
print2(args);
}
void print2(Args...)(Args args){
//do something
}
你可以这样称呼它
print1(1, 2);
但是如果可变参数中有一个不可复制的类型怎么办?
struct Foo{
@disable this(this);
~this(){
}
}
然后
print(1, 2, Foo());
Error: struct app.Foo is not copyable because it is annotated with @disable
mixins 应该可以
void print1(Args...)(Args args){
mixin(forward!(print2, Args));
}
这将扩展到
// with `print(1, 2, Foo());`
void print1(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
,任何可以通过引用传递的参数都将是。
您也可以将其与 std.functional.forward
结合使用:
void print2(Args...)(auto ref Args args) { ... }
void print1(Args...)(Args args) {
print2(forward!args);
}