Schauen, ob Member-Funktion exestiert?



  • Hallo,
    gibt es irgendeine Möglichkeit zur Compilezeit zu sehen, ob eine statische Member-Funktion einer Klasse exestiert?
    Am Ende sollte dann soetwas funktionieren:

    class B
    {
      //int Memberfunction();
    };
    
    //Funktion "Memberfunction" exestiert nicht in B
    template<bool b> class AImpl
    {
    };
    
    //Funktion "Memberfunction" exestiert in B
    template<> class AImpl<true>
    {
    };
    
    class A:
      public AImpl<member_functions_exists<B::Memberfunction> >
    {
    };
    

    Danke...





  • Cool. Gibt es auch soetwas, um eine spezielle Funktion zu finden (z.B. Hat Klasse X die statische Member-Funktion mit zwei Template-Argumenten und 3 normalen Argumenten)?



  • Wozu brauchst du eigtl. diese Infos? also in deinem Programm, irgendwie hört sich das etwas schräg an ...



  • Checker&Murckser schrieb:

    Wozu brauchst du eigtl. diese Infos? also in deinem Programm, irgendwie hört sich das etwas schräg an ...

    Für Optimierungen würd' ich das benutzen. Standardbeispiel ist std::sort auf einer Range, was man mithilfe solcher schrägen Sachen für einzelne Container überladen könnte:

    template <class Range>
    void sort (Range const& r)
    {
        do_sort (r, has_sort<Range>);
    }
    
    template <class Range>
    void do_sort (Range const& r, true_type const&)
    {
        r.sort ();
    }
    
    template <class Range>
    void do_sort (Range const& r, false_type const&)
    { // normaler Sortieralgorithmus
    }
    

    Geht bestimmt auch trickier, aber das fällt mir da direkt ein.

    funct0r schrieb:

    Cool. Gibt es auch soetwas, um eine spezielle Funktion zu finden (z.B. Hat Klasse X die statische Member-Funktion mit zwei Template-Argumenten und 3 normalen Argumenten)?

    Hmm, die normalen Argumente kannst du vielleicht erwischen, für die Templateargumente fällt mir gerade nichts ein.


  • Mod

    .filmor schrieb:

    Gibt es:
    http://www.boost.org/libs/mpl/doc/refmanual/has-xxx-trait-def.html

    Das findet aber nur Typen.

    funct0r schrieb:

    Cool. Gibt es auch soetwas, um eine spezielle Funktion zu finden (z.B. Hat Klasse X die statische Member-Funktion mit zwei Template-Argumenten und 3 normalen Argumenten)?

    Unwahrscheinlich. Was man braucht, ist ein Konstrukt, das legal ist, unabhängig davon, ob der betreffende Memember existiert oder nicht, aber in Abhängigkeit davon seine Bedeutung verändert. Für solche Dinge fällt mir SFINAE ein. Das Problem mit Funktionstemplates (nicht: Templatefunktionen - die haben keine Templateparameter) ist, dass sie nichts selbst Parameter eines Templates sein können. Daher sehe ich hier kaum eine Möglichkeit. In der Regel interessiert ja aber auch nur, ob eine bestimmte Operation existiert, unabhängig davon, ob diese durch ein Template oder z.B. einfache Funktionsüberladung realisiert wurde.


Anmelden zum Antworten