Переиспользование списка базовых классов
Есть такой код
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: Переиспользование списка базовых классов
Здравствуйте, koenjihyakkei, Вы писали:
K>Можно ли здесь убрать дублирование списка классов?
Как вариант:
template <typename ... Ts>
class AT : public Ts... {
void fn() {
some_func<Ts...>();
}
};
using A = AT<B, C, D>;
Re[2]: Переиспользование списка базовых классов
Здравствуйте, Voivoid, Вы писали:
Да, вариант, не подумал о таком.
Re[3]: Переиспользование списка базовых классов
Здравствуйте, koenjihyakkei, Вы писали:
K>Здравствуйте, Voivoid, Вы писали:
K>Да, вариант, не подумал о таком. Но все-таки не хотелось бы выносить текущие имена классов в отдельные типы.
Re[2]: Переиспользование списка базовых классов
От:
Sm0ke
ksi
Дата: 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]: Переиспользование списка базовых классов
Здравствуйте, koenjihyakkei, Вы писали:
K>>Здравствуйте, Voivoid, Вы писали:
K>>Да, вариант, не подумал о таком. Но все-таки не хотелось бы выносить текущие имена классов в отдельные типы.
boost:mp11:mp_apply или mp_rename должны помочь.
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить