如何减少重载函数的数量

mey*_*ani 3 c++ overloading

我想知道是否有一种方法可以减少下面代码中重载函数(函数编辑)的数量。

 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 个重载函数!这就是为什么我认为应该有更好的方法。

谢谢。

Jar*_*d42 7

使用可变参数和 (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);)。