Beliebig viele mutable Argumente



  • Guten Abend!

    Ich habe eine Funktion, die mehrere Parameter besitzt. Dabei soll ein einzelner Vektor sowie eine beliebige Anzahl von Vektoren von der Funktion verändert werden:

    void rotate(const vec3& p1, vec3& point, std::vector<vec3>& axis, float angle)
    

    Sowohl Parameter point also auch axis soll in-place von der Funktion geändert werden können (sind quasi in-out-parameter)

    Zuerst dachte ich an std::initializer_list, nur das Problem ist hier, dass die Elemente in der initializer_list const sind: Geht also nicht.

    Dann dachte ich an einen std::vector wie oben gezeigt. Problem ist nur, dass die Elemente im vector ja nur Kopien sind, die Funktion diese also nicht ändern kann.

    Wie könnte ich das am besten machen, dass rotate() sowohl parameter "point" also auch eine beliebige Anzahl weiterer Vektoren bekommt und diese ändern kann?



  • argor schrieb:

    Dann dachte ich an einen std::vector wie oben gezeigt. Problem ist nur, dass die Elemente im vector ja nur Kopien sind, die Funktion diese also nicht ändern kann.

    Wie meinste das?

    void f()
    {
      std::vector<int> v {1};
      g(v);
      cout << v[0]; // output 42
    }
    void g(vector<int>& v)
    {
      v[0] = 42;
    }
    

  • Mod

    std::vector<std::reference_wrapper<vec3>>


  • Mod

    reference_wrapper:

    #include <iostream>
    #include <initializer_list>
    #include <functional>
    
    void foo(std::initializer_list<std::reference_wrapper<int>> objects)
    {
      for(auto i : objects)
        i.get() = 5;
    }
    
    int main()
    {
      int i = 1, j = 2, k = 3;
      foo({i,j,k});
      std::cout << i << j << k << '\n';
    }
    

  • Mod

    void foo(auto&... os) {
      ((os = 5), ...);
    }
    
    int main()
    {
      int i = 1, j = 2, k = 3;
      foo(i,j,k);
      std::cout << i << j << k << '\n';
    }
    


  • Arcoth schrieb:

    void foo(auto&... os) {
      ((os = 5), ...);
    }
     
    int main()
    {
      int i = 1, j = 2, k = 3;
      foo(i,j,k);
      std::cout << i << j << k << '\n';
    }
    
    clang++:
    arcoth.cpp:2:10: error: 'auto' not allowed in function prototype
    void foo(auto&... os) {
             ^~~~
    g++:
    Warnung: ISO-C++ verbietet Verwendung von »auto« in Parameterdeklaration [-Wpedantic]
     void foo(auto&... os) {
              ^~~~
    

  • Mod

    irrt arcoth? schrieb:

    Arcoth schrieb:

    void foo(auto&... os) {
      ((os = 5), ...);
    }
     
    int main()
    {
      int i = 1, j = 2, k = 3;
      foo(i,j,k);
      std::cout << i << j << k << '\n';
    }
    
    clang++:
    arcoth.cpp:2:10: error: 'auto' not allowed in function prototype
    void foo(auto&... os) {
             ^~~~
    g++:
    Warnung: ISO-C++ verbietet Verwendung von »auto« in Parameterdeklaration [-Wpedantic]
     void foo(auto&... os) {
              ^~~~
    

    dcl.spec.auto p1 schrieb:

    The auto and decltype(auto) type-specifiers are used to designate a placeholder type that will be replaced
    later by deduction from an initializer. The auto type-specifier is also used to introduce a function type having
    a trailing-return-type or to signify that a lambda is a generic lambda (8.1.5.1). The auto type-specifier is also
    used to introduce a structured binding declaration (11.5).

    Arcoths foo kommt hier nicht vor. Es ergeben sich auch eine Menge andere Probleme, die geklärt werden müssen, wenn man diese Syntax zulässt. Klar ist z.B., dass foo - wenn überhaupt - nicht bloß eine einzelne Funktion ist. Andererseits wäre es auch kein Template. Dann ist schon mal nicht ganz klar, wie dieses auto-foo bei Überladung mit andern foo-Funktionen zu behandeln ist. Bei generischen Lambdas besteht dieses Problem nicht, weil sowieso immer nur ein Operator() existiert.


  • Mod

    Vielleicht mal das Concepts proposal lesen (oder was sollen dieses Zitat und die merkwürdigen Kommentare?).

    Andererseits wäre es auch kein Template.

    Natürlich ist es ein Template. Allerdings gibt es tatsächlich Uneinigkeit bzgl. dieser Syntax, die für viele nicht explizit genug ist. Siehe http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0587r0.pdf


  • Mod

    Arcoth schrieb:

    Vielleicht mal das Concepts proposal lesen (oder was sollen dieses Zitat und die merkwürdigen Kommentare?).

    Wir reden hier über C++ wie es ist, nicht wie manche es sich wünschen, wie es sein sollte und vielleicht mal später sein wird (u.U. weil es heute bereits genutzt werden soll). Wenn du über Concepts reden willst, dann ist es deine Aufgabe vorher darauf hinzuweisen.



  • Es ist leider ein wiederkehrendes Merkmal, dass Hacker sich an noch nicht abgesegneten Standards (oder gar Papers) bedient, und infolge dessen Code postet, der nicht einmal mit neuen Compilern erfolgreich kompiliert. Dabei erwähnt er oft subtil, an welchem Paper er gerade arbeitet oder was für einen Talk er hält, auch wenn dies absolut nichts zur Sache tut. Wird er darauf hingewiesen, er solle uns doch bitte im Vorfeld mitteilen, was für einem C++-Standard sein Code entspricht, so ignoriert er es meistens oder wird stattdessen bissig und herablassend:

    Arcoth schrieb:

    Vielleicht mal das Concepts proposal lesen.

    Nein, Hacker, vielleicht mal die Birne einschalten und realisieren, dass der OP C++ will und nicht das, was du eben oben kommentarlos hingekackt hast?


  • Mod

    Wenn du über Concepts reden willst, dann ist es deine Aufgabe vorher darauf hinzuweisen.

    Tut mir Leid, Daddy. 😞


  • Mod

    Arcoth Arkot schrieb:

    Es ist leider ein wiederkehrendes Merkmal, dass Hacker sich an noch nicht abgesegneten Standards (oder gar Papers) bedient, und infolge dessen Code postet, der nicht einmal mit neuen Compilern erfolgreich kompiliert.

    Mein Code kompiliert mit GCC. 😕

    Dabei erwähnt er oft subtil, an welchem Paper er gerade arbeitet oder was für einen Talk er hält, auch wenn dies absolut nichts zur Sache tut.

    Das ist hier offensichtlich nicht der Fall. Und ich hätte gern Nachweise.


Anmelden zum Antworten