Deduction of nontype function template parameter



  • GIbt es eine Möglichkeit den Wert eines nontype parameters durch Funktionsaufruf zu inferieren, also

    template<int T>
    void foo() {
      std::cout << T << std::endl;
    }
    

    Klar funktioniert

    int main() {
      foo<5>();
    }
    

    aber kann ich irgendwie die Signatur von foo ändern, sodass T beim Aufruf automatisch deduziert wird?



  • Wie willst du das machen.

    Die Funktion kann sich doch nicht aus dem Hut ziehen welchen Wert T haben soll.

    Template default arguments?



  • ich sag ja, ich möchte das irgendwie durch funktion parameter machen, weiß aber nicht wie



  • Dann mach doch einfach einen type-Parameter daraus?



  • ja klar, ich wollte nur wissen, ob es irgendwie funktioniert mit nem nontype parameter



  • Na angenommen das ginge, welchen Wert sollte T denn haben, wenn du nichts angegeben hast?

    Wie gesagt kannst du default non-type template params benutzen und selbst dann noch muss die Funktion in etwa so func<>() ausgeführt werden.



  • Okay vielen Dank



  • Muss mich korrigieren. Bei Funktionen kannst du das <> weglassen, wenn alles automatisch deduziert wird, was bei Klassen jedoch nicht der Fall ist.

    Find ich im Nachhinein ziemlich doof, weil das zu Mehrdeutigkeiten führen kann.

    Jedenfalls meine ich mal gelesen zu haben dass in nächster Zukunft die Template-Parameter auch für Klassentypen überflüssig werden, insofern die Typen alle korrekt deduziert werden können.



  • @spiri sagte in Deduction of nontype function template parameter:

    Muss mich korrigieren. Bei Funktionen kannst du das <> weglassen, wenn alles automatisch deduziert wird, was bei Klassen jedoch nicht der Fall ist.

    Find ich im Nachhinein ziemlich doof, weil das zu Mehrdeutigkeiten führen kann.

    Jedenfalls meine ich mal gelesen zu haben dass in nächster Zukunft die Template-Parameter auch für Klassentypen überflüssig werden, insofern die Typen alle korrekt deduziert werden können.

    Du meinst

    #include <utility>
    #include <iostream>
    
    int main()
    {
            auto p = std::pair(1, 2.3);
            std::cout << p.first << " " << p.second << "\n";
    }
    
    

    ?
    Das funktioniert mit C++ 17.



  • ja, wenn der ctor er ermöglicht, alle template paramter zu deduzieren.


Log in to reply