Как выполнить все функции из базовых классов crtp в классе, производном от переменной? - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть производный класс CRTP , который является шаблоном с переменным числом всех базовых классов CRTP, которые он может наследовать.Я хочу выполнить функцию из каждого унаследованного класса (в этом примере функции печати) в методе производного класса (функция printAll).Как я могу это сделать?

// Base Class 1
template<typename Derived>
struct Mult
{
  void print()
  {
    int a = (static_cast<Derived const&>(*this)).m_a;
    int b = (static_cast<Derived const&>(*this)).m_b;
    std::cout << "a * b: " << a * b << "\n";
  }
};

// Base Class 2
template<typename Derived>
struct Add
{
  void print()
  {
    int a = (static_cast<Derived const&>(*this)).m_a;
    int b = (static_cast<Derived const&>(*this)).m_b;
    std::cout << "a + b: " << a + b << "\n";
  }
};

template<template<typename> typename... Bases>
struct Derived : public Bases<Derived<Bases...>>...
{
  int m_a, m_b;
  Derived(int a, int b) : m_a(a), m_b(b) {}
  void printAll()
  {
    // Should execute the print method of all the derived classes
    this->print();
  }
};


int main()
{
  Derived<Mult, Add> d(2, 3);
  // should print:
  // a + b: 5
  // a * b: 6
  d.printAll();
}

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Вы можете использовать сложенное выражение , одну из новых функций языка в C ++ 17:

void printAll()
{
    (Bases<Derived>::print(), ...);
}
0 голосов
/ 10 февраля 2019
  void printAll()
  {
    auto _ = {(Bases<Derived<Bases...>>::print(), 0) ...};
  }

Демо

...