Zugriff auf static const struct Member eines struct Members ohne Instanz



  • Hi,

    ich denk der Titel ist ein wenig verwirrend. Also gleich mal das Beispiel:

    template<typename SizeType, SizeType min, SizeType max>
    		struct Opaque {		
    			typedef SizeType size_t;
    			static const size_t MIN = min;
    			static const size_t MAX = max;
    
    			std::vector<std::uint8_t> data;
    		};
    
    		template<std::uint8_t exp>
    		struct power_two {
    			static const std::size_t value = 1 << exp;
    		};
    
    		struct TLSPlaintext {			
    
    			ContentType contentType;
    			ProtocolVersion version;
    			Opaque<std::uint16_t, 0, power_two<14>::value> data;
    
    		};
    

    Ich hab jetzt diese beiden structs 'TLSPlaintext' und 'Opaque'.
    Nun moechte ich von TLSPlaintext auf data::MAX zugreifen ohne das ich eine Instanz davon erstelle.

    std::cout << TLSPlaintext::data::MAX << "\n"; // So moechte ich drauf zugreifen, geht nicht
    
    std::cout << TLSPlaintext().data.MAX << "\n"; // So gehts...
    

    Gibt es da ueberhaupt eine Moeglichkeit?

    Gruessle


  • Mod

    decltype(TLSPlaintext::data)::MAX
    


  • ungetstet:

    struct TLSPlaintext {          
    
                ContentType contentType;
                ProtocolVersion version;
                typedef Opaque<std::uint16_t, 0, power_two<14>::value> OT;
                OT data;
    
            };
    std::cout << TLSPlaintext::OT::MAX << "\n";
    


  • camper schrieb:

    decltype(TLSPlaintext::data)::MAX
    

    Omfg das hatte ich auch schon. Leider hat mir Visual Studio 2013 das 'decltype' rot unterringeld und gesagt: "Error: type name is not allowed". Dadurch hab ich garnicht probiert ob sich das ueberhaupt bauen laesst und habs wieder verworfen. Aber es funktioniert wunderbar:

    std::cout << sizeof(decltype(tunnel::tls::TLSPlaintext::data)::size_t) << "\n";
    	std::cout << decltype(tunnel::tls::TLSPlaintext::data)::MIN << "\n";
    	std::cout << decltype(tunnel::tls::TLSPlaintext::data)::MAX << "\n";
    
    /*
       2
       0
       16384
    */
    

    Leider sagt mir VS bei jedem decltype & ::[..] das das falsch ist....
    Aber Danke vielmals.


Anmelden zum Antworten