Ich weiß, dass es viele Möglichkeiten gibt zu erkennen, ob eine Klasse eine bestimmte Funktion hat, aber keine von ihnen wirklich für meinen genauen Fall funktioniert. Meine aktuelle Implementierung, um nach der korrekten Member-Funktion zu suchen, funktioniert mit Ausnahme von Vererbung-Funktionen.Typ Merkmal: Überprüfen Sie, ob die Klasse eine bestimmte Funktion hat (vielleicht erben)
#include <type_traits>
template<typename T>
class HasFoo {
template <typename U, int (U::*)(float)>
struct Check;
template <typename U>
static std::true_type Test(Check<U, &U::foo> *);
template <typename U>
static std::false_type Test(...);
public:
static constexpr bool value = decltype(Test<T>(0))::value;
};
struct A {
int foo(float);
};
struct B : public A {
};
struct C {
unsigned int foo(double);
};
struct D {
static int foo(float);
};
static_assert(HasFoo<A>::value, "A should have foo.");
static_assert(HasFoo<B>::value, "B should inherit foo from A.");
static_assert(!HasFoo<C>::value, "C should not have foo.");
static_assert(!HasFoo<D>::value, "Ds static foo should be false.");
Diese Implementierung nicht für die static_assert von B.
Eine inakzeptable Abhilfe zu überprüfen wäre funktioniert:
template <typename U, int (U::A::*)(float)>
struct Check; |
|- add base class
Aber es hätte ich wissen die Basisklasse und das sollte vermieden werden.
Hat jemand eine Idee, wie man auch nach abgeleiteten Funktionen prüft?
Bearbeiten: Der Typ Merkmal sollte auch funktionieren, wenn überhaupt keine Foo vorhanden sind.
struct E {};
static_assert(!HasFoo<E>::value, "E does not have foo.");
Vielen Dank für die Antwort. Ich habe vergessen zu erwähnen: Wenn die Klasse überhaupt kein Foo hat, sollte sie kompilieren. Bearbeite meine Frage. – Viatorus
@Viatorus Ich habe meine Antwort aktualisiert - Dies ist nicht so sauber wie die erste Version, aber das könnte verbessert werden. – Holt