title: Forwarding variadic arguments containing non copyable types
body: <pre class="lang-d prettyprint-override"><code>void print1(Args...)(Args args){
      print2(args);
  }
  void print2(Args...)(Args args){
      //do something
  }
  </code></pre>
  
  <p>And you can call it like this</p>
  
  <pre class="lang-d prettyprint-override"><code>print1(1, 2);
  </code></pre>
  
  <p>But what if there is a non copyable type inside the variadic argument?</p>
  
  <pre class="lang-d prettyprint-override"><code>struct Foo{
      @disable this(this);
      ~this(){
      }
  }
  </code></pre>
  
  <p>then</p>
  
  <pre class="lang-d prettyprint-override"><code>print(1, 2, Foo());
  </code></pre>
  
  <blockquote>
    <p>Error: struct app.Foo is not copyable because it is annotated with @disable</p>
  </blockquote>
  
  <p>It should be possible with mixins</p>
  
  <pre class="lang-d prettyprint-override"><code>void print1(Args...)(Args args){
      mixin(forward!(print2, Args));
  }
  </code></pre>
  
  <p>which would expand to</p>
  
  <pre class="lang-d prettyprint-override"><code>// with `print(1, 2, Foo());`
  void print1(Args...)(Args args){
      mixin("print2(args[0], args[1], args[2].move()");
  }
  </code></pre>
  
  <p>Are there any other alternatives besides this? Does something like this already exist?</p>