String-literal als Template Parameter


  • Mod

    template< const char* p >
    struct T
    {
    };
    
    T< static_cast< const char* >( "a" ) > t;
    

    bringt bei mir:

    error C2762: 'T' : invalid expression as a template argument for 'p' : see declaration of 'T'

    geht so etwas überhaupt, und wenn ja, wie?



  • AFAIK dürfte sowas nicht gehen, da du einen Parameter mit externer Bindung brauchst, ein String Literal aber interne Bindung hat (14.3.2-2).



  • groovemaster schrieb:

    AFAIK dürfte sowas nicht gehen, da du einen Parameter mit externer Bindung brauchst, ein String Literal aber interne Bindung hat (14.3.2-2).

    das stimmt; also machen wir einen String mit externer Bindung.

    #include <iostream>
    
    extern const char txt[];
    
    template< const char* Txt >
    struct Foo
    {
        static const char* name() { return Txt; }
    };
    
    const char txt[] = "Hugo";
    int main()
    {
        using namespace std;
        cout << Foo< txt >::name() << endl;
        return 0;
    }
    

    Gruß
    Werner



  • besser als extern funktioniert aber static



  • Hallo,
    eine andere Annäherung, die aber natürlich nicht in allen Situationen praktikabel ist, sieht so aus:

    struct Strings
    {
        const char* hello() const {return "hello";}
        const char* world() const {return "world";}
    };
    
    template <const char* (Strings::*p)() const>
    class Foo
    {};
    
    int main()
    {
        Foo<&Strings::hello> f1;
        Foo<&Strings::world> f2;
    }
    


  • otze schrieb:

    besser als extern funktioniert aber static

    Wie meinen?



  • otze schrieb:

    besser als extern funktioniert aber static

    Aber nur als Klassen Member. Im Namensraum hat der Bezeichner wiederum interne Bindung und ist somit kein gültiges Argument.


Anmelden zum Antworten