我想知道是否有一种方法可以减少下面代码中重载函数(函数编辑)的数量。
class foo
{
public:
foo(int _a, char _b, float _c) : a(_a), b(_b), c(_c){};
void edit(int new_a);
void edit(char new_b);
void edit(float new_c);
void edit(int new_a, char new_b);
void edit(int new_a, float new_c);
void edit(char new_b, float new_c);
void edit(int new_a, char new_b, float new_c);
void info();
private:
int a;
char b;
float c;
};
Run Code Online (Sandbox Code Playgroud)
这是编辑功能的实现:
void foo::edit(int new_a)
{
a = new_a;
}
void foo::edit(char new_b)
{
b = new_b;
}
void foo::edit(float new_c)
{
c = new_c;
}
void foo::edit(int new_a, char new_b)
{
a = new_a;
b = new_b;
}
void foo::edit(int new_a, float new_c)
{
a = new_a;
c = new_c;
}
void foo::edit(char new_b, float new_c)
{
b = new_b;
c = new_c;
}
void foo::edit(int new_a, char new_b, float new_c)
{
a = new_a;
b = new_b;
c = new_c;
}
Run Code Online (Sandbox Code Playgroud)
编辑功能可以让用户按照自己的意愿更改对象的参数。但问题是,如果我们添加一个新参数,我们必须添加许多重载函数,我认为应该有更好的方法。
这里有 3 个参数,我们需要 7 个重载函数,但如果我们有 4 个参数(a、b、c 和 d),那么我们必须开发 14 个重载函数!这就是为什么我认为应该有更好的方法。
谢谢。
使用可变参数和 (ab)using std::get<T>on std::tuple,你可能会这样做
template <typename... Ts>
void edit(Ts... values)
{
((std::get<Ts&>(std::tie(a, b, c)) = std::get<Ts&>(std::tie(values...))), ...);
}
Run Code Online (Sandbox Code Playgroud)
演示。
注意:我使用std::get<Ts&>(std::tie(values...))而不是简单地values得到重复输入类型的错误(edit(42, 42);)。