La classe derivata nasconde il nome di un sovraccarico impostato dalla classe di base se la classe derivata ha definito lo stesso nome, ma possiamo sempre introdurre tale sovraccarico arretrato con l'utilizzo di dichiarazione:C++ - Come introdurre il set di sovraccarico dal numero variabile di basi.
template <class BASE>
class A : public BASE
{
public:
using BASE::some_method;
void some_method();
}
Ma cosa succede se Presento tutti i set di sovraccarico dalle classi di base variadic? Sarei in grado di scrivere qualcosa del genere?
template <class... BASES>
class A : public BASES...
{
public:
using BASES::some_method...;
void some_method();
}
ho pensato di utilizzare una classe di supporto come:
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;
};
e lo fa di lavoro. Ma richiede un sacco di digitazione (ovviamente posso usare la macro ma cerco di usare la funzione di compilazione di C++ ogni volta che è possibile), e quando voglio introdurre più metodi, devo cambiare molto in quel pezzo di codice.
Una risposta perfetta sarebbe una sintassi semplice, ma se non ce ne sono, andrò con la classe helper.
ereditarietà ricorsiva, o ADL a bizzeffe (quest'ultimo richiede la modifica di tutte le basi). C++ 17 potrebbe consentire l'espansione del pacchetto nell'utilizzo di dichiarazioni - c'è un problema di EWG aperto a riguardo. –
@ T.C. Ho scritto un articolo: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0195r0.html – Columbo