[C++] std::abs() und Verwandte für eigenen Typ überladen

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Schrompf
Moderator
Beiträge: 4838
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

[C++] std::abs() und Verwandte für eigenen Typ überladen

Beitrag von Schrompf »

Moin mal wieder,

ich habe einen eigenen Datentyp für Rumrechnereien, genauer gesagt die Festkommaklasse von letztens. Ich möchte dafür nun abs(), sqrt() usw. anbieten. Wie mache das am besten? Darf ich überhaupt etwas Eigenes im std-Namespace definieren? Oder sollte ich die namespace-freie Funktion überladen? Kann ich die "In der Klasse als friend"-Methode ausnutzen, so dass nur mein Typ den Overload benutzt, aber nicht irgendein integraler Typ, in den mein Typ vielleicht konvertierbar ist?

Danke im Voraus!
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Sternmull
Establishment
Beiträge: 264
Registriert: 27.04.2007, 00:30
Echter Name: Til
Wohnort: Dresden

Re: [C++] std::abs() und Verwandte für eigenen Typ überladen

Beitrag von Sternmull »

Du kannst ADL und unqualifizierte Aufrufe nutzen:

Code: Alles auswählen

#include <cmath>

class Foo
{
    friend Foo abs(Foo x) // alternativ geht natürlich auch eine friend-Funktion außerhalb der Klasse
    {
        return Foo(std::abs(x._val));
    }

    int const _val;
public:
    explicit Foo(int val) : _val(val){}
    int value() const {return _val;}
};

int main(int argc, char *argv[])
{
    using namespace std;
    Foo x{-123};
    Foo y = abs(x);

    int i = -100;
    int i2 = abs(i2);

    float f = -1.23;
    float f2 = abs(f);

    return 0;
}
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [C++] std::abs() und Verwandte für eigenen Typ überladen

Beitrag von dot »

Schrompf hat geschrieben:Darf ich überhaupt etwas Eigenes im std-Namespace definieren?
Nope, darfst du nicht. Einzige Ausnahme: Spezialisierungen von std:: Templates (z.B. Traits).
Schrompf hat geschrieben:Oder sollte ich die namespace-freie Funktion überladen?
jope
Schrompf hat geschrieben:[...] so dass nur mein Typ den Overload benutzt, aber nicht irgendein integraler Typ, in den mein Typ vielleicht konvertierbar ist?
Wenn dein Typ konvertierbar ist, ist er konvertierbar, daran lässt sich nix ändern. Ein Trick wäre, eine weitere Dummyklasse zu definieren, die in deinen Typ konvertierbar ist und deine Funktion dann für diese zu bauen, denn eine conversion sequence kann niemals mehr als eine user-defined conversion enthalten...
Antworten