Применять функции, принадлежащие другим классам, с помощью шаблонов с переменными параметрами - PullRequest
1 голос
/ 25 апреля 2019

Скажем, у меня есть три класса, ClassA, ClassB и ClassC.И все три из этих классов имеют функцию с именем updateValue(int).И тогда у меня есть класс контроллера под названием Controller.Конструктор Who имеет следующий шаблон:

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
};

Как видите, я хочу иметь возможность брать классы из некоторой структуры данных и вызывать их функции.Например, в main у меня будет:

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);

}

Каждый класс имеет свой собственный способ обновления значения, например, ClassA имеет setValue(int), ClassB имеет setInt(int) и ClassC имеет updateNumber(int).Мой план состоит в том, чтобы написать функцию updateValue в каждый из этих классов, который будет вызывать их функции-установщики.Тем не менее, я не уверен, как добиться того, что я пытаюсь сделать.Как мне распаковать все классы и вызвать их функцию updateValue(int)?

1 Ответ

2 голосов
/ 25 апреля 2019

Из вашего текущего интерфейса вы можете сделать что-то вроде:

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;
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...