C ++: метод выполнения вызова метода для каждого члена в структуре - PullRequest
0 голосов
/ 05 февраля 2019

Предположим, у меня есть следующее

struct X {
   typeA_t A;
   typeB_t B;
   ...
   typeZ_t Z; // Where some of these are Unions

   void do_something(){
      A.do_something();
      B.do_something();
      ...
      Z.do_something();
   }
};

Есть ли способ для разрозненных классов A - Z, чтобы я сократил это до одной или двух строк?

Если я использую наследованиеЯ могу избавиться от A-Z, но не могу избавиться от количества строк.

Если вы не голосуете, пожалуйста, объясните почему.Если это фундаментальная проблема с C ++, это не веская причина.

1 Ответ

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

Не уверен, что это сработает, но вместо 26 членов вашего класса вы можете иметь кортеж из 26 элементов с типами, указанными в списке параметров шаблона.Затем можно перебрать элементы:

template <class... T>
struct generic_X {
    std::tuple<T...> data;
    void do_something() {
        do_something_helper(std::index_sequence_for<T...>{});
    }
    template <size_t... i>
    void do_something_helper(std::index_sequence<i...>) {
        (std::get<i...>(data).do_something(), ...);
    }
};
using X = generic_X<typeA_t, ..., typeZ_t>;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...