Klasa pochodna ukrywa nazwę przeciążenia ustalonym z klasy bazowej, jeśli klasa pochodna ma taką samą nazwę zdefiniowane, ale zawsze możemy przedstawić, że przeciążenie cofnięty z wykorzystaniem-deklaracji:C++ - Jak wprowadzić zestaw przeciążeniowy z variadic number of bases.
template <class BASE>
class A : public BASE
{
public:
using BASE::some_method;
void some_method();
}
ale co jeśli Wprowadzam wszystkie zestawy przeciążeniowe z klas bazowych variadic? Czy mógłbym napisać coś takiego?
template <class... BASES>
class A : public BASES...
{
public:
using BASES::some_method...;
void some_method();
}
ja uważane za pomocą klasy pomocnika jak:
template <class... BASES>
struct helper;
template <>
struct helper<> {};
template <class OnlyBase>
struct helper<OnlyBase> : OnlyBase
{
using OnlyBase::some_method;
};
template <class Base1, class... OtherBases>
struct helper<Base1, OtherBases> : public Base1, public helper<OtherBases...>
{
using Base1::some_method;
using helper<OtherBases...>::some_method;
};
I to działa. Ale wymaga to dużo pisania (oczywiście mogę używać makra, ale staram się używać funkcji kompilacji C++, gdy tylko jest to możliwe), a kiedy chcę wprowadzić więcej metod, muszę dużo zmienić w tym fragmencie kodu.
Doskonałą odpowiedzią byłaby prosta składnia, ale jeśli jej nie ma, przejdę do klasy pomocnika.
Rekursywne dziedziczenie, lub mnóstwo ADL (to ostatnie wymaga modyfikacji wszystkich baz). C++ 17 może pozwolić na rozszerzenie paczki przy korzystaniu z deklaracji - jest to kwestia otwarta na poziomie EWG. –
@ T.C. Napisałem artykuł: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0195r0.html – Columbo