通过可变参数模板应用属于其他类的函数

Apply functions belonging to other classes through variadic templates

本文关键字:其他 属于 函数 应用 变参 参数      更新时间:2023-10-16

假设我有三个类,ClassAClassBClassC。这三个类都有一个叫做 updateValue(int) 的函数。然后我有一个名为 Controller 的控制器类。谁的构造函数模板

化如下:
class Controller
{
  public:
    template <class...Classes>
    Controller(Classes & ...classes); // maybe initialize a tuple?
    void setValues(int val)
    {
      // unpack whatever data structure and call each classes updateValue(int)
    }
  private:
    std::tuple<Classes...classes> packedClasses; // Not sure if this is good idea? This will not compile
};

如您所见,我希望能够从某些数据结构中获取类,并调用它们的函数。例如,在主要情况下,我将有:

int main()
{
  ClassA A;
  ClassB B;
  ClassC C;
  Controller controller1(A,B);
  Controller controller2(A,C);
  Controller controller3(B,C);
  Controller controller4(A,B,C);
  controller4.setValues(20);
}

每个类都有自己的更新值的方式,例如ClassAsetValue(int)ClassBsetInt(int)ClassCupdateNumber(int)。我的计划是将函数updateValue写入每个类中,这些类将调用它们的 setter 函数。但是,我不确定如何实现我想要做的事情。如何解压缩所有类并调用它们的函数updateValue(int)

在当前界面中,您可以执行以下操作:

class Controller
{
 public:
    template <class...Classes>
    Controller(Classes&... classes)
    {
        mF = [&](int val) { (classes.updateValue(val), ...); }; // Fold expression from C++17
    }
    void setValues(int val)
    {
        mF(val);
    }
    private:
        std::function<void(int)> mF;
    };
相关文章: