Heim > Backend-Entwicklung > C++ > Wie können Merkmale vom Typ C 11 das Vorhandensein einer Mitgliedsfunktion mit einer bestimmten Signatur erkennen?

Wie können Merkmale vom Typ C 11 das Vorhandensein einer Mitgliedsfunktion mit einer bestimmten Signatur erkennen?

Mary-Kate Olsen
Freigeben: 2024-12-26 22:59:10
Original
940 Leute haben es durchsucht

How Can C  11 Type Traits Detect the Presence of a Member Function with a Specific Signature?

Erkennen der Anwesenheit von Mitgliedsfunktionen mithilfe von Merkmalen vom Typ C 11

Frage:

Wie können wir Bestimmen Sie, ob eine Klasse eine Mitgliedsfunktion mit einer bestimmten Signatur besitzt, ohne dass die Klasse diese bereitstellen muss es?

Ausarbeitung des Dilemmas:

Das Problem entsteht, wenn wir benutzerdefinierte Operationen basierend auf dem Vorhandensein oder Fehlen einer bestimmten Mitgliedsfunktion in einer Klasse ausführen müssen. Im Gegensatz zu Fällen, in denen die Klasse die Funktion bereitstellen muss, suchen wir nach einer Methode, um ihre Existenz für die bedingte Verarbeitung zu erkennen. Die ideale Lösung vermeidet das Überschreiben globaler Funktionen, übermäßige Stapelaufrufe und aufdringliche Namespace-Deklarationen.

Vorlagenbasierte Lösung:

Unter Verwendung von C 11-Typmerkmalen können wir eine entwickeln Vorlagenfunktion, die die Existenz des Ziels überprüft Funktion:

template<typename C, typename Ret, typename... Args>
struct has_serialize {
    // Assertion to prevent instantiation with non-function arguments
    static_assert(
        std::integral_constant<T, false>::value,
        "Second template parameter needs to be of function type."
    );

    // Specialization to perform the check
    private:
        template<typename T>
        static constexpr auto check(T*)
        -> typename
            std::is_same<
                decltype( std::declval<T>().serialize( std::declval<Args>()... ) ),
                Ret    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            >::type;  // attempt to call it and see if the return type is correct

        template<typename>
        static constexpr std::false_type check(...);

        typedef decltype(check<C>(0)) type;

    public:
        static constexpr bool value = type::value;
};
Nach dem Login kopieren

Verwendung:

Wir können jetzt die Vorlage has_serialize verwenden, um die Existenz einer Funktion innerhalb einer Klasse zu überprüfen:

struct X {
    int serialize(const std::string&amp;) { return 42; } 
};

struct Y : X {};

std::cout << has_serialize<X, int(const std::string&amp;)>::value; // prints 1
Nach dem Login kopieren

In Im obigen Beispiel wird has_serialize::value auch verwendet Wird als wahr ausgewertet, da die Vererbung die Funktionssignatur beibehält. Diese Funktion ist ein entscheidender Vorteil gegenüber der im Originalthread vorgestellten Lösung.

Das obige ist der detaillierte Inhalt vonWie können Merkmale vom Typ C 11 das Vorhandensein einer Mitgliedsfunktion mit einer bestimmten Signatur erkennen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage