有没有办法在 C++ 中显式调用可选参数?
Is there a way to explicitly call optional arguments in c++?
当我创建一个函数时:
int addThree(int x=1, int y=1, int z=1)
我想调用该函数,使其使用 x 和 z 的默认参数,而不是 y。
有些尝试 addThree(5,,5)
和 addThree(5,NULL,5)
,但都没有效果。
默认参数必须在列表的最后,因此请按以下步骤操作
int addThree(int y , int x = 1, int z = 1)
{
//some stuff
return someInt;
}
,因此你可以称它为
int ans = addThree(4);
如果您一直为一个参数传递一个值并为其他参数使用默认值,则可以将参数重新排列为首先需要传递的参数,然后使用默认值的参数。但这仅在您提供值与使用默认值的值基本上始终相同的情况下才有效。
否则,如果您非常需要类似于基本功能的东西,您可以传递一个 class 的实例,并让 class 实现命名参数习惯用法。
class triplet {
int x_ {1};
int y_ {1};
int z_ {1};
public:
triplet &x(int val) { x_ = val; return *this; }
triplet &y(int val) { y_ = val; return *this; }
triplet &z(int val) { z_ = val; return *this; }
int x() const { return x_; }
int y() const { return y_; }
int z() const { return z_; }
};
int addThree(triplet const &t) {
return oldAddThree(t.x(), t.y(), t.z());
}
int ans = addThree(triplet().x(4));
这使您可以根据需要为所需的任意数量的值使用默认值,并且仅覆盖您实际需要的值。另一方面,它确实增加了相当多的语法开销,因此您必须非常希望该功能来打扰。
C++中的默认参数,需要紧接指定,不能在非默认参数之后。
所以,像
int sum(int x = 0, int y, int z = 0) {
return (x + y + z);
}
在 C++ 中被禁止
函数需要如下:
#include <iostream>
int sum(int x, int y = 0, int z = 0) {
return (x + y + z);
}
int main() {
std::cout << sum(1) << "\n";//calls sum(1,0,0)
std::cout << sum(1,2) << "\n";//calls sum(1,2,0)
return 0;
}
但是,在指定默认参数时,您始终需要注意函数重载。重载函数不能被二义性调用..
所以代码如下:
#include <iostream>
int sum(int x, int y = 0, int z = 0) {
return (x + y + z);
}
float sum(int x, float y = 0.0, float z = 0.0) {
return (float(x) + y + z);
}
int main() {
std::cout << sum(1) << "\n";
return 0;
}
不编译并且 righty 产生歧义错误,因为编译器不理解
是否应该调用第一个和,或者第二个和。
当我创建一个函数时:
int addThree(int x=1, int y=1, int z=1)
我想调用该函数,使其使用 x 和 z 的默认参数,而不是 y。
有些尝试 addThree(5,,5)
和 addThree(5,NULL,5)
,但都没有效果。
默认参数必须在列表的最后,因此请按以下步骤操作
int addThree(int y , int x = 1, int z = 1)
{
//some stuff
return someInt;
}
,因此你可以称它为
int ans = addThree(4);
如果您一直为一个参数传递一个值并为其他参数使用默认值,则可以将参数重新排列为首先需要传递的参数,然后使用默认值的参数。但这仅在您提供值与使用默认值的值基本上始终相同的情况下才有效。
否则,如果您非常需要类似于基本功能的东西,您可以传递一个 class 的实例,并让 class 实现命名参数习惯用法。
class triplet {
int x_ {1};
int y_ {1};
int z_ {1};
public:
triplet &x(int val) { x_ = val; return *this; }
triplet &y(int val) { y_ = val; return *this; }
triplet &z(int val) { z_ = val; return *this; }
int x() const { return x_; }
int y() const { return y_; }
int z() const { return z_; }
};
int addThree(triplet const &t) {
return oldAddThree(t.x(), t.y(), t.z());
}
int ans = addThree(triplet().x(4));
这使您可以根据需要为所需的任意数量的值使用默认值,并且仅覆盖您实际需要的值。另一方面,它确实增加了相当多的语法开销,因此您必须非常希望该功能来打扰。
C++中的默认参数,需要紧接指定,不能在非默认参数之后。
所以,像
int sum(int x = 0, int y, int z = 0) {
return (x + y + z);
}
在 C++ 中被禁止
函数需要如下:
#include <iostream>
int sum(int x, int y = 0, int z = 0) {
return (x + y + z);
}
int main() {
std::cout << sum(1) << "\n";//calls sum(1,0,0)
std::cout << sum(1,2) << "\n";//calls sum(1,2,0)
return 0;
}
但是,在指定默认参数时,您始终需要注意函数重载。重载函数不能被二义性调用..
所以代码如下:
#include <iostream>
int sum(int x, int y = 0, int z = 0) {
return (x + y + z);
}
float sum(int x, float y = 0.0, float z = 0.0) {
return (float(x) + y + z);
}
int main() {
std::cout << sum(1) << "\n";
return 0;
}
不编译并且 righty 产生歧义错误,因为编译器不理解 是否应该调用第一个和,或者第二个和。