[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.

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

Beitragvon Schrompf » 03.03.2017, 22:42

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!
Häuptling von Dreamworlds. Baut an was Neuem. Hilft nebenbei nur höchst selten an der Open Asset Import Library mit.
Benutzeravatar
Schrompf
Thomas Ziegenhagen
Moderator
 
Beiträge: 3588
Registriert: 26.02.2009, 00:44
Wohnort: Dresden
Benutzertext: Lernt nur selten dazu

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

Beitragvon Sternmull » 04.03.2017, 12:04

Du kannst ADL und unqualifizierte Aufrufe nutzen:

Code: Ansicht erweitern :: 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
Sternmull
Til
 
Beiträge: 264
Registriert: 27.04.2007, 00:30
Wohnort: Dresden

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

Beitragvon dot » 04.03.2017, 15:14

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...
Benutzeravatar
dot
Michael Kenzel
 
Beiträge: 1578
Registriert: 06.03.2004, 19:10


Zurück zu Programmiersprachen, Quelltext und Bibliotheken

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron