2016-07-18 5 views
1
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

それは

// with `print(1, 2, Foo());` 
void print1(Args...)(Args args){ 
    mixin("print2(args[0], args[1], args[2].move()"); 
} 
に拡大するミックスイン

void print1(Args...)(Args args){ 
    mixin(forward!(print2, Args)); 
} 

で可能でなければなりませんこれ以外の選択肢はありますか?このようなものはすでに存在しますか?

答えて

3

print1print2関数は、値渡し時にコピーされることを意味する関数のパラメータの値を受け取ります。コピーできない値はコピーできません(移動しない限り、元の値は無効になります) )。

コピーできない値を受け入れるには、参照で渡す必要があります。可変引数テンプレートであることを行う最も簡単な方法は、auto refを使用することです:

auto ref
void print1(Args...)(auto ref Args args) { ... } 

によって参照渡すことができる任意の引数になります。

またstd.functional.forwardでこれを組み合わせることができます。

void print2(Args...)(auto ref Args args) { ... } 
void print1(Args...)(Args args) { 
    print2(forward!args); 
} 
関連する問題