假设这段代码:
#include<stdio.h>
int t(int a, int b=6, int c=7){
return b;
}
int main(){
return 0;
}
如何调用T
,只传递A和C
值,并让B
作为默认值?
那是没有办法的。 参数只能按顺序传递,因此不能将默认参数用于显式传递的参数之前的参数。
但是,您可以使用聚合类作为参数,它与默认成员初始值设定项和指定初始值设定项(C++20)相结合,是命名参数传递的良好模拟:
struct Args {
int a;
int b = 6
int c = 7;
};
int t(const Args& args);
int main()
{
t({
.a = 42,
// b will be 6
.c = 1337,
});
}
使用指定的初始值设定项并不是强制性的,因此C++20并不是必需的。 只是更简洁,更易读。
根据程序的结构,T
作为类的成员函数可能是有意义的。
如果您只想重载b
,这将起作用。 如果您的目标是重载c
同时,那么您应该去一些更复杂的东西,正如在其他答案中提到的。 ;)
在C++中没有直接的方法可以做到这一点。 尽管您可以链接函数调用(这在以成员作为默认参数实现类方法时非常常用)。
类似于这样的解决方案应该可以很好地工作:
#include<iostream>
int t(int a, int b, int c) {
return b;
}
int t(int a, int c) {
return t(a, 6, c);
}
int main() {
auto x = t(1, 2); // this will call t with a = 1, b = 6, c = 2
std::cout << x; // prints 6
return 0;
}