0

可変引数を受け入れ、それらの引数で他の関数を呼び出すテンプレート関数があるとします...

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 が有効になります。

4

2 に答える 2

2

はい、個別のオーバーロードを作成します。

template <typename A1>
func(A1 arg1)
{
    x(arg1);
}

template <typename A1, typename A2>
func(A1 arg1, A2 arg2)
{
    y(arg1, arg2);
}

template <typename A1, typename A2, typename A3>
func(A1 arg1, A2 arg2, A3 arg3)
{
    z(arg1, arg2, arg3);
}

(もちろん、追加の共通コードは、別の共通関数、場合によっては可変個引数関数テンプレートに分解できます。)

于 2013-01-14T23:04:37.787 に答える
0

...この投稿を見てください。可変数のパラメーターを使用していることを示すパラメーターとして使用できることを私は知っています。

...C++での構文

これは、よくコメントされたコードを使用した別の例です 。va_listを使用したCおよびC++の可変引数リストを持つ関数

これがお役に立てば幸いです。

于 2013-01-14T23:09:48.683 に答える