提供第二个可选参数,而不需要提供第一个可选参数
Supply second optional argument without need to suply first optional argument?
我有一个这样的函数:
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);}
这样,您就可以使用任何一组参数进行调用。
相关文章:
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 将可变参数从一个函数传递到另一个函数
- 如何仅读取文本文件中的第一个值
- 在C++中,如何在第一个"system()"结束后执行第二个"system()"?
- C++ 如何根据作为输入传递的参数调用一个构造函数或另一个构造函数?
- 查找不在标准中的第一个值::设置<int>最小-最大值
- C++:忽略第一个 cin.ignore 之后的输入
- 将参数从一个函数传递到另一个函数(没有模板) - C++
- 在C++中打印多个矢量的第一个值
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- C++第一个cout将不会打印
- 我们可以在第一个else-if条件结束后使用另一个else-if条件吗
- 用输出参数包装一个c++函数,以便在javascript/node中使用
- OpenGL:第二个VBO破坏了第一个VBO
- 为什么第一个Dynamic_cast没有投射到基类?
- OpenGL 2D游戏只绘制第二个精灵纹理而不是第一个
- C++ 为什么程序只读取第一个值
- 将 std::string 作为参数从一个 DLL 传递到另一个 DLL 引发访问冲突错误
- 将参数初始化为构造函数,而不是第一个