2016-05-08 18 views
0

私は関数がすべて同じことをし、それらのパラメータのいくつかを別の関数に転送するので、複数の類似メンバ関数をバリデーションテンプレートで置き換えようとしています。この非テンプレートのC++バリデーションテンプレート関数

template<typename... Ts> 
void function(Ts... ts, bool d= false) 
{ 
     if (!isStateMemoryFixed) isStateMemoryFixed = true; 
     helper.help(ts...); 
     if (d) doStuff(); 
} 

void function(T a, T b, double c, bool d = false) 
{ 
    if (!isStateMemoryFixed) isStateMemoryFixed = true; 
    helper.help(a, b, c); 
    if (d) doStuff(); 
} 
void function(T a, T b, T e, double c, bool d = false) 
{ 
    if (!isStateMemoryFixed) isStateMemoryFixed = true; 
    helper.help(a, b, e, c); 
    if (d) doStuff(); 
} 

と私は前のと同じようにそれを呼び出す:私は、これらの二つの機能を置き換えることを試みた

void test() 
{ 
    T a,b,e; 
    double c; 
    Obj obj; 
    obj.function(a,b,e,c,true); 
} 

が、私はエラーを取得:「テンプレートのインスタンスを...引数リストと一致します "。 私はvariadicテンプレートを初めて使っていますが、私が読んできたことは、これを行うことができるはずであることを示唆しています。

+2

'Tsのになる、それは最後のパラメータでない場合、それは自動的に決定することができないので...'、空のままになります。そのため、効果的に 'bool'パラメータしかない関数を呼び出します。したがって、エラーメッセージです。 –

+1

別の言い方をすれば、 'true'が' ts'の一部であるときと 'd'のデフォルト以外の値であるときをコンパイラが知る方法は?そのため、variadicパラメータはパラメータリストの最後に置かれます(残念ながら 'd'のデフォルト値を持つことと矛盾します)。 –

+0

[OT]: 'if(!isStateMemoryFixed)isStateMemoryFixed = true;'おそらく 'isStateMemoryFixed = true;'に置き換えてください。 – Jarod42

答えて

0

Johannes SchaubとBo Perssonによると、バリデーションパラメータはリストの最後にある必要があります。

IMHOは、このように関数を書き直すことができます(注意:テストされていないので、cパラメータは必須であり、タイプはdoubleです)。

template<typename... Ts> 
void function(double c, bool d, Ts... ts) 
{ 
     if (!isStateMemoryFixed) isStateMemoryFixed = true; 
     helper.help(ts..., c); 
     if (d) doStuff(); 
} 

それは等価ではありません:あなたはdのデフォルトfalse値を失います。

コールが

function(c, true, a, b, e); 
関連する問題