Templates



  • Hallo!

    Ich möchte mir hier gern ein Template bauen, dass sowohl mit Werten als auch mit Zeigern umgehen kann. Nur leider muss die Zeiger-Variante geringfügig anders implementiert werden als die zeigerlose Variante. Aber wie bringe ich dem Compiler bei, dass zwei Varianten vorhanden sind und er bitte die richtige wählen soll? Geht das überhaupt?



  • template <typename T>
    class Foo
    {
    public:
      void bar(T t)
      {
        Impl(t).baz();
      }
    
    private:
        template<typename P>
        P& Impl(P* e)
        {
            // pipapo für Zeiger
            return *e;
        }
    
        template<typename P>
        P& Impl(P& e)
        {
            // pipapo für Referenz
            return e;
        }
    };
    


  • Es hat ein wenig gedauert bis ich kapiert habe, dass Du noch ein Template im Template hast und P nicht T ist. Aber was soll ich sagen: Das funktioniert wunderbar.

    Vielen Dank!



  • Ansonsten gibt es auch noch Templatespezialisierung:

    template<class T>
    class Foo<T> //das <T> ist rudimentär
    {
      //Klasse für alles ausser Zeiger
    };
    template<class T>
    class Foo<T*>
    {
      //Klasse für Zeiger
    };
    


  • Mussel schrieb:

    Ich möchte mir hier gern ein Template bauen,

    Was für eins? Klassentemplate? Funktionstemplate?

    Mussel schrieb:

    dass sowohl mit Werten als auch mit Zeigern umgehen kann. Nur leider muss die Zeiger-Variante geringfügig anders implementiert werden als die zeigerlose Variante.

    Bist Du Dir da sicher? Ich zweifle das mal an.

    Mussel schrieb:

    Geht das überhaupt?

    Ja. (Teil-)Spezialisierung beziehungsweise Überladung mit oder ohne SFINAE/enable_if. Versuche um's Spezialisieren von größeren Klassendefinitionen drum rum zu kommen. Das geht meist anders eleganter.


Anmelden zum Antworten