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!
[C++] std::abs() und Verwandte für eigenen Typ überladen
- Schrompf
- Moderator
- Beiträge: 5077
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
[C++] std::abs() und Verwandte für eigenen Typ überladen
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
- 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
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;
}
- dot
- Establishment
- Beiträge: 1745
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: [C++] std::abs() und Verwandte für eigenen Typ überladen
Nope, darfst du nicht. Einzige Ausnahme: Spezialisierungen von std:: Templates (z.B. Traits).Schrompf hat geschrieben:Darf ich überhaupt etwas Eigenes im std-Namespace definieren?
jopeSchrompf hat geschrieben:Oder sollte ich die namespace-freie Funktion überladen?
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...Schrompf hat geschrieben:[...] so dass nur mein Typ den Overload benutzt, aber nicht irgendein integraler Typ, in den mein Typ vielleicht konvertierbar ist?