可変引数を受け入れ、それらの引数で他の関数を呼び出すテンプレート関数があるとします...
template<typename... A> func(int i, A... args)
{
// do something common
switch (i)
{
case 0: x(args...); break;
case 1: y(args...); break;
case 2: z(args...); break;
default: break;
}
// do something common
}
...そして、他の関数は次のように定義されています...
void x(int a, int b);
void y(int a, int b); // note: takes same args as x()
void z(std::string a);
std::string 引数を指定して func() を呼び出すと、std::string 引数を取る x() と y() の一致が見つからないため、これはコンパイルされません。
func() は、いくつかの外部基準 (この例ではパラメーター i の値) を使用して、パラメーター引数を渡す他の関数を決定することに注意してください。
パラメータ引数を std:tuple に詰め込み、それを渡すようなことに頼らずにこれをやってのける方法はありますか?
[編集]
わかりました、私は自分の目的に十分に適したアプローチを見つけました。説明するクラスの例を次に示します...
class X
{
private:
bool a(int) { return true; }
bool b(int) { return true; }
template<typename... A> bool a(const A&...) { return false; }
template<typename... A> bool b(const A&...) { return false; }
public:
template<typename... A> void x(int i, const A&... args)
{
if (i == 0)
{
a(args...);
}
else
{
b(args...);
}
}
};
a() および b() の可変個引数テンプレート メソッドは、引数が単一の int ではない Xx() への呼び出しをキャッチします。これにより、受け取っていたコンパイラ エラーが解決され、探していたより単純なクラス API が有効になります。