Template-Spezialisation nur benutzen, falls es sie nicht schon gibt



  • Ich habe gerade das Problem, dass ich den GCC-spezifischen Typ __int128_t nicht mit generischem Code benutzen kann, weil make_unsigned und dergleichen diesen nicht kennen.

    Ich könnte das ja prinzipiell so nachholen:

    namespace std {
      template <> struct make_unsigned<__int128_t> {
        typedef __uint128_t type;
      };
    
      template <> struct make_signed<__uint128_t> {
        typedef __int128_t type;
      };
    }
    

    Kann ich es irgendwie so hinbekommen, dass diese Spezialisationen nur benutzt wird, falls es sie nicht schon gibt (z.B. durch Update der Standardbibliothek) und es den Typ __int128_t auch tatsächlich gibt?



  • Es ist wohl nicht möglich zu prüfen ob es einen Typ gibt.

    Ich würde den Kram in einen eigenen Namespace tun und den benutzen:

    namespace stdaddon{ //geht nicht mit std
    	template<class T>
    	struct make_unsigned{
    		using type = typename std::make_unsigned<T>::type;
    	};
    	template<>
    	struct make_unsigned<__int128_t>{
    		using type = __uint128_t;
    	};
    }
    
    int main(){
    	stdaddon::make_unsigned<__int128_t>::type i;
    	std::cout << typeid(i).name();
    }
    

    Sollte es tatsächlich ein Update geben kannst du mit wenig Aufwand direkt die Standardbibliothek benutzen:

    namespace stdaddon{
    	using namespace std; //einfache globale Änderung
    }
    
    int main(){ //clientcode gleich
    	stdaddon::make_unsigned<__int128_t>::type i;
    	std::cout << typeid(i).name();
    }
    

    Es ist wohl über Bande möglich zu testen, ob es eine Klasse gibt. Damit kannst du bestimmt testen, ob es std::make_unsigned<__int128_t> gibt und andernfallst definieren, vorausgesetzt es gibt __int128_t.



  • Stimmt, wenn ich eine eigene Variante dieser Templates einführe, funktioniert immerhin schon mal mein eigener Code. Ich dachte, es wäre schon, wenn ich damit auch fremden Code sozusagen 128 bit-fähig machen könnte. Aber wenn ich mir es recht überlege, dann ist es nicht meine Angelegenheit, mich um die Funktionalität von fremden Code zu kümmern, sondern die des Nutzers.

    Dass man zumindest die Existenz von Klassen überprüfen kann, ist schon mal sehr nützlich, da sowieso fast alles eine Klasse ist (und offenbar ist das Makro __SIZEOF_INT128__ definiert, wenn __int128_t verfügbar ist).

    Danke, ist damit gelöst.


Anmelden zum Antworten