有没有办法确保传递给函数的两个参数被视为C++中的第一个和第三个参数



假设有一个函数具有以下原型:

void fun (int = 10, int = 20, int = 30, int = 40);

如果这个函数是通过向它传递2个参数来调用的,我们如何确保这些参数被视为第一个和第三个,而第二个和第四个则被视为默认值。

// three and four argument version
void fun (int a, int b, int c, int d = 40)
{
...
}
// two argument version
void fun (int a, int c)
{
fun(a, 20, c, 40);
}
// one and zero argument version
void fun(int a = 10)
{
fun(a, 20, 30, 40);
}

但实际上我的建议是不要。

您可以定义Args结构,如:

struct Args {
int a = 10;
int b = 20;
int c = 30;
int d = 40;
};

然后你会有以下内容:

void fun(Args);
fun({.a=60, .c=70}); // a=60, b=20, c=70, d=40

除了这种方法之外,您还可以使用NamedType库来实现C++中的命名参数。有关更多使用信息,请查看此处。

更新

指定初始化器功能可由GCC和CLANG扩展使用,并且从C++20开始,它可由C++标准使用。

这个是有效的,它使用函数重载。

#include <iostream>
using namespace std;
void fun(int a = 10, int b = 20, int c = 30, int d = 40){
cout << "a = " << a << "nb = " << b << "nc = " << c << "nd = " << d;
}
void fun(float a, float c, int b = 20, int d = 40){
cout << "a = " << a << "nb = " << b << "nc = " << c << "nd = " << d;
}
int main(){
cout << "Enter two numbers : ";
float a, b;
cin >> a >> b;
fun(a, b);
return 0; 
}

也许更优雅的方法是像这样使用std::bindstd::placeholders

#include <functional>
void fun (int = 10, int = 20, int = 30, int = 40) {}
using namespace std::placeholders;
auto bindedFun = std::bind(fun, _1, 20, _2, 40);
int main()
{
bindedFun(1234, 5678);
}

我发现它更清晰,更容易理解。此外,它不太容易出错!如果你不想有一个全局变量来保存你的绑定,你可以在本地声明它,也可以把你的绑定放在一个结构中。

最新更新