Seite 1 von 1

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

Verfasst: 03.03.2017, 21:42
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!

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

Verfasst: 04.03.2017, 11:04
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;
}

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

Verfasst: 04.03.2017, 14:14
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...