Wie kann ich prüfen, ob eine Mitgliedsfunktion existiert und nicht geerbt ist?Prüfen, ob Mitgliedsfunktion existiert und nicht für SFINAE vererbt wird
Ich brauche diese Zweideutigkeit für das folgende Beispiel zu beheben:
Ein Typ hat entweder eine foo()
oder eine bar()
Memberfunktion. Caller
wird call
derjenige, der für den angegebenen Typ existiert. DerivedWithBar
erbt jedoch foo()
von BaseWithFoo
, definiert aber eigene bar()
. Daher weiß Caller
nicht, welche Funktion aufgerufen werden soll.
Ich würde einen Weg brauchen, um die nicht geerbte foo
Vorrang vor der geerbten bar()
, aber ich weiß nicht, wie man überprüft, ob eine Member-Funktion vererbt wird oder nicht.
#include <iostream>
struct BaseWithFoo
{
template <typename T> void foo(T&&){std::cout << "Base::foo" << std::endl;}
};
struct DerivedWithBar : public BaseWithFoo
{
template <typename T> void bar(T&&){std::cout << "DerivedWithBar::bar" << std::endl;}
};
struct DerivedWithFoo : public BaseWithFoo
{
template <typename T> void foo(T&&){std::cout << "DerivedWithFoo::foo" << std::endl;}
};
struct EmptyDerived : public BaseWithFoo {};
struct BaseWithBar
{
template <typename T> void bar(T&&){std::cout << "BaseWithBar::bar" << std::endl;}
};
struct Caller
{
template <typename T>
auto call(T&& x) -> decltype(x.foo(*this), void())
{
x.foo(*this);
}
template <typename T>
auto call(T&& x) -> decltype(x.bar(*this), void())
{
x.bar(*this);
}
};
int main()
{
Caller c;
c.call(BaseWithFoo());
c.call(DerivedWithFoo());
c.call(DerivedWithBar());
c.call(EmptyDerived());
c.call(BaseWithBar());
}
gewünschter Ausgang:
Base::foo
DerivedWithFoo::foo
DerivedWithBar::bar
Base::foo
BaseWithBar::bar
Kennen Sie die Signatur der zu testenden Funktion ('void U :: foo (Caller &)')? – Jarod42
@ Jarod42 die Signatur ist wie Sie es geschrieben haben, aber es ist eine Template-Funktion, so muss es generische sein –