提供第二个可选参数,而不需要提供第一个可选参数

Supply second optional argument without need to suply first optional argument?

本文关键字:参数 第一个 不需要 第二个      更新时间:2023-10-16

我有一个这样的函数:

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

我试着接受一个可选的论点,比如

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

但这就产生了一个错误。如何在不需要提供其他可选值的情况下仅访问我选择的可选值?

根据您的需要,您可以重载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参数创建单独的重载函数。

如果你真的想,你可以使用类似于命名参数习惯用法的东西,例如:

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命名的参数库。

就我个人而言,我会添加两个重载:

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);}

这样,您就可以使用任何一组参数进行调用。