所以,我有这样的功能:
void foo(int optionalinteger=0, float optionalfloat=0.0f, cell *optionalarray=NULL)
{
return;
}
我试图访问像
这样的可选参数 foo(.optionalfloat=5.5f);//from another programming language
但这会产生错误。 如何只访问我选择的可选值而无需提供其他可选值?
答案 0 :(得分: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
个参数创建单独的重载函数。
答案 1 :(得分:3)
如果你真的想,你可以使用类似于named parameter 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 named parameter library。
答案 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);}
这样你就可以使用任何一组参数进行调用。