Operator Template in Klasse



  • Hallo,

    class A
    {
    public:
        template <typename T>
        bool operator()(const std::string& str)
        {
    
        }
    };
    

    Wenn ich den Operator jetzt benutzen möchte:

    A instance;
    
    if (instance<int>("test"))
    {
    
    }
    

    Bekomme ich die Fehlermeldung vom Compiler, das er erst eine "primary expression" vor dem '<' Token erwartet. Wenn ich es so schreibe:

    instance.operator()<int>("test")
    

    ... tritt der Fehler nicht mehr auf.

    1. Wieso tritt dieses Verhalten auf?
    2. Wie kann ich das so hinkriegen "wie ich es will"?

    Grüße



  • 1. Weil instance kein Template ist.
    2. Garnicht. Operatoren kannst Du nicht templatisieren, es seidenn der Template-Parameter kann deduziert werden, weil T in der Parameterliste des Operators vorkommt.



  • Zur Deduzierung kannste bspw. ein identity-Template o.ä. verwenden:

    template <typename T> struct identity {using type = T;};
    
    class A
    {
    public:
        template <typename T>
        bool operator()(identity<T>, const std::string& str)
        {
    
        }
    };
    ....
    instance(identity<int>{}, "test")
    

    ggf. identity schöner nennen, so dass das semantisch mehr Sinn macht.



  • Danke für die Antworten.

    using type = T;
    

    ... was bewirkt das?


  • Mod

    asadsad schrieb:

    Danke für die Antworten.

    using type = T;
    

    ... was bewirkt das?

    typedef T type;
    


  • asadsad schrieb:

    Danke für die Antworten.

    using type = T;
    

    ... was bewirkt das?

    Das ist die neue Version eines typedefs in C++11. Äquivalent zu typedef T type.

    Ist hier auch nicht notwendig, nur der vollständig halber, weil man identity auch nutzen kann, wenn man keine Deduktion haben möchte:

    template <typename T>
    void deduced(T t);
    
    template <typename T>
    void non_deduced(typename identity<T>::type t);
    

    Weil der Compiler nicht wissen kann, ob identity spezialisiert ist, kann er T nicht deduzieren.


Anmelden zum Antworten