转发包含非可复制类型的可变参数

时间:2016-07-18 16:13:48

标签: d

void print1(Args...)(Args args){
    print2(args);
}
void print2(Args...)(Args args){
    //do something
}

你可以这样称呼它

print1(1, 2);

但是如果variadic参数中有一个不可复制的类型怎么办?

struct Foo{
    @disable this(this);
    ~this(){
    }
}

然后

print(1, 2, Foo());
  

错误:struct app.Foo不可复制,因为它是用@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()");
}

除此之外还有其他选择吗?这样的事情是否已经存在?

1 个答案:

答案 0 :(得分:3)

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

要接受不可复制的值,您需要按引用传递它们。使用可变参数模板的最简单方法是使用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);
}