Jeśli moja klasa podstawowa ma funkcję func(int)
, a moja klasa pochodna ma funkcję func(double)
, pochodna func(double)
ukrywa base::func(int)
. Mogę użyć using
przynieść wersję bazową w wykazie czerpać z dnia przeciążeń:Potrzebuję czegoś takiego jak "using Base :: *;"
struct base
{
void func(int);
};
struct derived : base
{
using base::func;
void func(double);
}
OK, świetnie. Ale co, jeśli nie jestem pewien, czy base
ma numer func()
, czy też nie? tzn. ponieważ robię metaprogramowanie szablonowe, nie jestem właściwie pewien, co to jest base
, ale chcę, aby jego funkcje były na tym samym poziomie - jeśli istnieją. czyli zmienić powyższy przykład do:
struct base_with
{
void func(int);
};
struct base_without
{
};
template <typename Base>
struct derived : Base
{
using Base::func; // if Base has a func(), I want to bring it in
void func(double);
}
derived<base_with> testwith; // compiles
derived<base_without> testwithout; // fails :-(
muszę using_if
jak boost::enable_if
. Nie wydaje się możliwe ...
Z góry dziękuję.
Co chcesz robić w ostateczności? Do czego służy wyrażenie "wyprowadzono"? –
Buduję klasy, które opcjonalnie wdrażają niektóre funkcje, w zależności od tego, jak/gdzie są używane. Co jest w zasadzie tylko refaktoryzacją, do pewnego stopnia - tj. Zamiast pisania klasy XWithFeatureA, XWithFeatureB, XWithFeatureAandB, ... która zamienia się w wiele klas tytułów, chcę mieć X, gdzie feature_traits decyduje, które funkcje są używane. –
tony
Funkcje takie jak "pozwala słuchaczom", "ma ustawiacze niestandardowe" itp. Dla obiektów w systemie. Nie sądzę, żebym mógł (lub wolno mi to opisać) opisać go na tyle, aby był przekonany, że system z opcjonalnymi funkcjami ma sens. – tony