2

私はこのような機能を持っています:

 void foo(int optionalinteger=0, float optionalfloat=0.0f, cell *optionalarray=NULL)
 {
          return;
 }

次のようなオプションの引数にアクセスしようとしました

 foo(.optionalfloat=5.5f); // from another programming language

しかし、それはエラーになります。他のオプション値を指定せずに、選択したオプション値のみにアクセスするにはどうすればよいですか?

4

3 に答える 3

4

必要に応じて、関数をオーバーロードできfoo()ます。

void foo(int optionalinteger=0, float optionalfloat=0.0f, cell *optionalarray=NULL)
{
    return;
}

void foo( float optionalfloat )
{
    foo( 0, optionalfloat, NULL );
}

もちろん、このソリューションはすべての状況で機能するとは限らないため、制限があります。次のメソッドが与えられた場合

void foo(int optlint=0, float optflt1=0.0f, float optflt2=0.0f, cell *optionalarray=NULL)
{
    return;
}

float両方のパラメーターに対してオーバーロードされた関数を個別に作成することはできません。

于 2012-07-12T17:21:27.427 に答える
3

本当にしたい場合は、名前付きパラメーター idiomに似たものを使用できます。たとえば、次のようになります。

struct cell;

void foo(int optionalinteger, float optionalfloat, cell *optionalarray) {}

struct foo_params {
  foo_params& integer(int v) { integer_ = v; return *this; }
  foo_params& fl(float v) { fl_ = v; return *this; }
  foo_params& array(cell *v) { array_ = v; return *this; }

  // C++11 defaults for laziness, easy to change though
  int integer_=0;
  float fl_=0.0f;
  cell *array_=nullptr;
};

void foo(foo_params params = foo_params()) {
  foo(params.integer_, params.fl_, params.array_);
}

int main() {
  foo(foo_params().integer(100)
                  .array(0));
}

コードベースでそのようなものを見ることを本当に期待していない場合、これは非常に単純で直感に反するものに対して非常に多くの作業です。

または、必要に応じて、 boost という名前のパラメーター ライブラリを使用することもできます。

于 2012-07-12T17:43:31.007 に答える
2

個人的には、2 つのオーバーロードを追加します。

void foo(int optionalinteger=0, float optionalfloat=0.0f, cell *optionalarray=NULL);

// Note: afloat not optional
void foo(float afloat , cell *optionalarray=NULL) {foo(0, afloat, optionalarray);}

// Note: anarray not optional
void foo(cell *anarray)                           {foo(0, 0.0f, anarray);}

そうすれば、任意のパラメータ セットで呼び出すことができます。

于 2012-07-12T17:36:57.820 に答える