Hat eine Klasse ein typedef definiert?



  • Ist es möglich zu überprüfen ob eine Klasse ein typedef definiert hat,
    aber ohne dabei ein mögliches typedef mit dem exakt gleichen Name in einer Basisklasse zu be­rück­sich­ti­gen.

    also

    struct Base
    {
    typedef int MyType;
    }
    
    struct Derived : Base
    {
    
    }
    

    Nun soll zur Compile zeit überprüft werden ob Derived das typedef MyType definiert hat. Hat es aber nicht.
    Ist das Problem mit standard C++ zu lösen, ja oder nein?
    Wenn ja, wie?



  • Im Allgemeinen eher Nein.



  • Mir ist keine standardisierte Möglichkeit dazu bekannt, wenn sollte eine vom Compiler angeboten werden.


  • Mod

    Wozu braucht man so etwas?

    struct foo : Derived, Base {};
    

    und dann schauen, ob ein (eindeutiges) foo::MyType existiert.



  • camper schrieb:

    Wozu braucht man so etwas?

    struct foo : Derived, Base {};
    

    und dann schauen, ob ein (eindeutiges) foo::MyType existiert.

    Ich verstehe nicht was du meinst. In dem Fall hat foo auch wieder ein MyType.


  • Mod

    Nash26 schrieb:

    camper schrieb:

    Wozu braucht man so etwas?

    struct foo : Derived, Base {};
    

    und dann schauen, ob ein (eindeutiges) foo::MyType existiert.

    Ich verstehe nicht was du meinst. In dem Fall hat foo auch wieder ein MyType.

    Keineswegs, schließlich wäre die Auflösung mehrdeutig.

    #include <type_traits>
    #include <utility>
    
    struct Base { typedef int MyType; };
    struct Derived : Base { };
    struct Derived2 : Base { using Base::MyType; };
    struct Derived3 : Base { typedef char MyType; };
    struct Derived4 : Base { typedef int MyType; };
    
    struct foo : Derived, Base {};
    struct bar : Derived2, Base {};
    struct baz : Derived3, Base {};
    struct boo : Derived4, Base {};
    
    template <typename T> struct identity { typedef T type; };
    
    template <typename T, typename = typename T::MyType>
    std::true_type has_MyType(identity<T>);
    std::false_type has_MyType(...);
    
    int main()
    {
        static_assert( decltype(has_MyType(identity<Base>()))::value, "Base should have MyType" );
        static_assert( decltype(has_MyType(identity<Derived>()))::value, "Derived should have MyType" );
        static_assert( decltype(has_MyType(identity<Derived2>()))::value, "Derived2 should have MyType" );
        static_assert( decltype(has_MyType(identity<Derived3>()))::value, "Derived3 should have MyType" );
    
        static_assert( decltype(has_MyType(identity<foo>()))::value, "should have inherited MyType" );
        static_assert( decltype(has_MyType(identity<bar>()))::value, "should have inherited MyType" );
        static_assert( !decltype(has_MyType(identity<baz>()))::value, "should be ambigous" );
        static_assert( !decltype(has_MyType(identity<boo>()))::value, "should be ambigous" );
    }
    

Anmelden zum Antworten