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テンプレートを初めて使っていますが、私が読んできたことは、これを行うことができるはずであることを示唆しています。
'Tsのになる、それは最後のパラメータでない場合、それは自動的に決定することができないので...'、空のままになります。そのため、効果的に 'bool'パラメータしかない関数を呼び出します。したがって、エラーメッセージです。 –
別の言い方をすれば、 'true'が' ts'の一部であるときと 'd'のデフォルト以外の値であるときをコンパイラが知る方法は?そのため、variadicパラメータはパラメータリストの最後に置かれます(残念ながら 'd'のデフォルト値を持つことと矛盾します)。 –
[OT]: 'if(!isStateMemoryFixed)isStateMemoryFixed = true;'おそらく 'isStateMemoryFixed = true;'に置き換えてください。 – Jarod42