Zeichenektte als Template-Parameter



  • Moin,

    kurz und bündig:
    Ist es irgendwie möglich einem Template eine Zeichenkette (die zur Compilezeit schon feststeht)als Parameter zu übergeben, ohne dass ich diesen in einer weiteren Struktur kapseln muss? Und wie sieht es diesbezüglich im neuen Standard aus?



  • Matzer schrieb:

    Ist es irgendwie möglich einem Template eine Zeichenkette (die zur Compilezeit schon feststeht)als Parameter zu übergeben, ohne dass ich diesen in einer weiteren Struktur kapseln muss?

    Klare Antwort: jein. Templateparameter können entweder Typen oder konstanten sein, wobei letztere auf integrale Typen (Integer-Typen, bool, Pointer, enums) beschrüänkt sind. Grundsätzlich könntest du also einen const char* als Temlateparameter übergeben - was dir aber nicht viel nützt, da der Vergleich von zweimal dem gleichen Stringliteral nicht immer true ergibt (d.h. der Compiler kann das selbe Literal an wzei Stellen im Speicher ablegen und die Pointer sind daher verschieden).



  • Neben Werten integraler Typen sind auch andere nicht-Typen als Template-Parameter zulässig: Zeiger und Referenzen auf Objekte und Funktionen mit externer Bindung.

    #include <iostream>
    
    template<const char * Text>
    struct ausgabe
    {
      void operator()() const {
        std::cout << Text << '\n';
      }
    };
    
    extern const char nachricht[] = "Hallo Welt!";
    
    int main()
    {
      ausgabe<nachricht>()();
    }
    

    Beachte: nachricht darf nur einmal in einer Übersetzungseinheit definiert werden. Die Deklaration, die man für andere TÜs in einen Header packen könnte, sieht dann so aus:

    extern const char nachricht[];
    

    Der Template-Parameter ist hier aber ein Zeiger und keine Zeichenkette. ausgabe<"Hallo"> wird nicht funktionieren, weil Zeichenliterale eine interne Bindung besitzen.

    Gruß,
    SP


Log in to reply