Переиспользование списка базовых классов
От: koenjihyakkei Россия  
Дата: 27.01.22 22:26
Оценка:
Есть такой код

class A : public B, public C, public D {
    void fn() {
       some_func<B, C, D>();
    }
};


Можно ли здесь убрать дублирование списка классов?

Может как-то через tuple можно?
using ABases = std::tuple<B, C, D>;

class A : public ABases::? {
    void fn() {
       some_func<ABases::?>();
    }
};

Но я всегда впадаю в ступор когда нужно конвертировать std::tuple в parameter pack
Re: Переиспользование списка базовых классов
От: Voivoid Россия  
Дата: 27.01.22 22:36
Оценка: 4 (1) +1
Здравствуйте, koenjihyakkei, Вы писали:

K>Можно ли здесь убрать дублирование списка классов?


Как вариант:
template <typename... Ts>
class AT : public Ts... {
    void fn() {
        some_func<Ts...>();
    }
};

using A = AT<B, C, D>;
Re[2]: Переиспользование списка базовых классов
От: koenjihyakkei Россия  
Дата: 28.01.22 19:41
Оценка:
Здравствуйте, Voivoid, Вы писали:

Да, вариант, не подумал о таком.
Re[3]: Переиспользование списка базовых классов
От: koenjihyakkei Россия  
Дата: 28.01.22 19:44
Оценка:
Здравствуйте, koenjihyakkei, Вы писали:

K>Здравствуйте, Voivoid, Вы писали:


K>Да, вариант, не подумал о таком. Но все-таки не хотелось бы выносить текущие имена классов в отдельные типы.
Re[2]: Переиспользование списка базовых классов
От: Sm0ke Россия http://ksi.ru.net/
Дата: 28.01.22 23:30
Оценка:
Здравствуйте, Voivoid, Вы писали:

V>Здравствуйте, koenjihyakkei, Вы писали:


K>>Можно ли здесь убрать дублирование списка классов?


V>Как вариант:

V>
V>template <typename... Ts>
V>class AT : public Ts... {
V>    void fn() {
V>        some_func<Ts...>();
V>    }
V>};

V>using A = AT<B, C, D>;
V>


Если у вас ряд классов с одинаковым списком типов, то можно их сделать nested.

template <typename ... Ts>
struct nest {

    class A1 : public Ts... {
        void fn() { some_func<Ts...>(); }
    };
    class A2 {
        void fn() { other_func<Ts...>(); }
    };

};

using wrap = nest<B, C, D>;


Тогда не придётся писать template <typename ... Ts> для каждого из них.
Re[4]: Переиспользование списка базовых классов
От: andrey.desman Россия  
Дата: 28.01.22 23:39
Оценка:
Здравствуйте, koenjihyakkei, Вы писали:

K>>Здравствуйте, Voivoid, Вы писали:

K>>Да, вариант, не подумал о таком. Но все-таки не хотелось бы выносить текущие имена классов в отдельные типы.

boost:mp11:mp_apply или mp_rename должны помочь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.