[C++0x/TR1] Feststellen, ob Member-Funktions-Typ const und/oder volatile ist?



  • Hallo,

    langsam zieht die Verwendung von TR1 etc. stark an. Der Header <type_traits> stellt seit TR1 und boost ein template is_const zur Verfügung, mit dem man feststellen können soll, ob ein Typ const ist.

    Nun möchte ich testen, ob die Signatur einer Member-Funktion const und/oder volatile ist, was jedoch nicht wie erwartet funktioniert:

    cout << is_const<void (dummy::*)() const>::value;
    

    Diese Anweisung gibt mir "0" zurück auf der Konsole. Wie teste ich richtig, ob ein const -Qualifier vorhanden ist?

    Bin für jeden Tipp dankbar 🙂



  • /rant/ schrieb:

    cout << is_const<void (dummy::*)() const>::value;
    

    Diese Anweisung gibt mir "0" zurück auf der Konsole.

    Der Funktionszeiger an sich ist ja auch nicht const, sondern nur die Funktion. Genauso wird

    cout << is_const<char const *>::value;
    

    auch 0 bzw false ausgeben, wohingegen

    cout << is_const<char * const>::value;
    

    1 bzw true liefern wird. is_const gibt Dir die "top-level-constness" zurück.

    /rant/ schrieb:

    Wie teste ich richtig, ob ein const -Qualifier vorhanden ist?

    Musst Du mal gucken. Vielleicht klappt ja schon so etwas wie is_const<remove_pointer<XXX>::type>::value. Bin mir da bei nicht-statischen Elementfunktionen nicht sicher, ob das so geht.

    Im Notfall bastelst Du Dir Deine eigene Traitsklasse.



  • is_const ist für Objekt-Typen, nicht für Funktionstypen gedacht.
    Ich hab jetzt auf die Schnelle bei boost nichts finden können was das erledigt was du suchst. Sollte aber nicht zu schwer zu implementieren sein:

    C++0x:

    template <typename F> 
    struct is_const_mem_fun_pointer: public false_type
    {};
    
    template <class T, typename R, typename ... A>
    struct is_const_mem_fun_pointer<R (T::*)(A...) const> : public true_type
    {};
    
    template <class T, typename R, typename ... A>
    struct is_const_mem_fun_pointer<R (T::*)(A...) const volatile> : public true_type
    {};
    

    Bei C++03 wirds schwieriger, da musst du dir für alle Parameterzahlen eigene Spezialisierungen schreiben *wärgs*. Siehe hier:

    http://www.boost.org/doc/libs/1_37_0/boost/type_traits/detail/is_mem_fun_pointer_impl.hpp



  • Danke, die Variante mit remove_pointer hatte ich bereits probiert und funktioniert natürlich nicht, aus dem gleichen Grund wie du geschrieben hast. Hingegen sieht das boost Zeugs dort genau nach dem aus, was ich suche. Vielen Dank, pumuckl! 👍

    PS: Ich warte sehnlichst auf bessere Untersützung für Variadic Templates. Das würde mein Leben so viel angenehmer machen. decltype und solche Dinge funktionieren super, aber das braucht man auch kaum 😮


Anmelden zum Antworten