0

最初のパラメーターに応じて異なるパラメーターを受け入れる関数 (C++11) を作成することは可能ですか? たとえば、次の動作が必要です。

enum TypeFill{Solid, Gradient1, Gradient2};

void fill(const TypeFill t,  Type1 param1 = NULL, Type2 param2 = NULL){
  if (t == Solid){
       fillSolid(param1);
  } else if (t == Gradient1){
       fillGradient1(param1, param2);
  } else if (t == Gradient2){
       fillGradient2(param1, param2);
  }
}

private:
fillSolid(Brush b){};                
fillGradient1(Color c1, Color c2){};
fillGradient2(Color c1, Color c2){};

呼び出し例:

fill(Solid, Brush(1.0, 0.0, 0.0)){};                
fill(Gradient1, Color(1.0, 0.0, 0.0), Color(1.0, 1.0, 0.0)){};
fill(Gradient2, Color(1.0, 0.0, 0.0), Color(1.0, 1.0, 0.0)){};

これが可能かどうかは疑問です。enable_if とテンプレートの特殊化で何かできるかもしれないと思いますが、そうではないかもしれません...

4

2 に答える 2

2

要約すると、いくつかのオーバーロードを持つことになるため、最も簡単な方法は次のように定義することです。

  • fillSolid(Brush b)
  • fillGradient(Color c1, Color c2)

この設計では、コンパイル時に特定の呼び出しごとに enum 値を知る必要があるため、得られるものはあまりありません。

OTOH では、列挙型の代わりに、それぞれ独自のデータ セットを持つ 、 、 などのさまざまなFill実装を実際に抽象化するように、コードを再設計することをお勧めします。SolidGradient1Gradient2


フォローアップ: これは、テンプレートで取得できる構文の例です。

fill<Solid>::call(Brush(1.0, 0.0, 0.0));               
fill<Gradient1>::call(Color(1.0, 0.0, 0.0), Color(1.0, 1.0, 0.0));
fill<Gradient2>::call(Color(1.0, 0.0, 0.0), Color(1.0, 1.0, 0.0));

列挙子は現在、関数の引数ではなく、クラス テンプレートのパラメーターであるため、コンパイル時に解決され、(メンバー) 関数のシグネチャはそれに依存することができます。

于 2014-01-26T10:38:36.380 に答える