Parameter fuer list.uniq()



  • Hallo,

    ich wuerde gerne fuer eine std::list<Foo> 'unique' benutzen, wobei zwei Instanzen der Klasse 'Foo' als gleich gelten sollen, wenn ein bestimmter Funktionswert kleiner als ein Parameter d ist, also in etwa

    bool similarFoo (const Foo& f1, const Foo& f2) {
     return function(f1, f2) < 3.14157;
    }
    
    // im Code
    mylist.unique(similarFoo);
    

    'function' koennte zum Beispiel der Abstand zwischen zwei Punkten sein.

    Nun moechte ich, anstatt die Grenze '3.14157' fest vorzugeben, sie der Funktion similarFoo diese Grenze als Parameter uebergeben.
    Ich dachte, dass das irgendwie per template gehen muesste, so dass ich quasi dann

    mylist.unique(similarFoo<3.14157>);
    

    angebe. Ist das moeglich, und wenn ja, wie lautet die korrekte Syntax zur Definition und Deklaration von 'similarFoo'?

    Ein "workaround" waere gewisse, in die Klasse Foo den cut-off als 'static double similar_cutoff;' mit hinzuzufuegen und diesen dan zu benutzen, doch scheint mir das unelegant, und um was Neues zu lernen, wuerde ich gerne wissen, ob es nicht doch mit so etwas wie obiger template-Version funktionieren koennte.

    Danke fuer alle Hilfen.



  • Funktoren/Funktionsobjekte sind das Stichwort.

    struct similarFoo
    {
        similarFoo(float tolerance)
        : tolerance(tolerance)
        {
        }
    
        bool operator() (const Foo& lhs, const Foo& rhs) const
        {
            return function(lhs, rhs) < tolerance;
        }
    
        float tolerance;
    };
    

    Anwendung:

    myList.unique(similarFoo(3.1415f));
    


  • Vielen Dank!


Anmelden zum Antworten