2016-05-04 21 views
-2

Gibt es eine Möglichkeit, einen Konvertierungsoperator zu definieren, der einen Parameter akzeptiert?C++ - Konvertierungsoperator mit Parameter

Hier ist mein Anwendungsfall:

class RGBColor 
{ 
    operator RGBAColor (const float alpha = 1.0) const noexcept; 
} 

Ich habe Umwandlung Betreiber von/HSB und RGB-Farben und RGBA zu RGB (durch die Alpha-dropping), aber ich habe Schwierigkeiten von RGB Umwandlung zu RGBA, da ich die Fähigkeit haben muss, das Alpha als einen Parameter zu liefern (anstatt immer einen voreinzustellen).

Ich gehe davon aus, dass ich werde etwas fallen zurück wie:

RGBAColor ToRGBAColor (const float alpha = 1.0) const noexcept; 

Allerdings würde ich es vorziehen, Standard C++ Konvertierung zu verwenden, so frage ich mich nur, wenn es irgendeine Art und Weise zu bedienen ist ein Konvertierungsoperator, der einen Parameter akzeptiert.

+0

dass das, was für ar Konstruktoren. –

+0

Ein Konvertierungsoperator kann kein zusätzliches Argument verwenden. Wie würden Sie es liefern? Ihre Konvertierungsfunktion, OTOH, sieht für mich gut aus. – 5gon12eder

+0

@IntellectualKitty Wie bereits erwähnt, stellen Sie einen Konstruktor wie 'RGBAColor (const RGBColor & rgb, float alpha = 1.0)' –

Antwort

1

Es gibt keine Möglichkeit, einem Darsteller weitere Parameter zu übergeben. Die Syntax erlaubt das nicht.

Wie in den Kommentaren und in der anderen Antwort erwähnt, stattdessen einen geeigneten Konstruktor bieten:

struct RGB { 
    float r_; 
    float g_; 
    float b_; 
}; 

struct RGBA : RGB { 
    float alpha_; 

    RGBA(const RGB& rgb) : RGB(rgb), alpha_(1.0) {} 
    RGBA(const RGB& rgb, float alpha) : RGB(rgb), alpha_(alpha) {} // <<<< 
    RGBA& operator=(const RGB& rgb) { 
     *static_cast<RGB*>(this) = rgb; 
     alpha_ = 1.0; 
     return *this; 
    } 
}; 
+0

@IntellectualKitty Sie können die Antworten akzeptieren, indem Sie auf das große Häkchen auf der linken Seite klicken. Sie müssen nicht Ihre eigene Antwort schreiben, um das zu sagen. –

4

Dies ist buchstäblich, was Konstruktoren sind.

Deklarieren und definieren Sie eins.

+0

[Etwas genauer erklärt] (http://stackoverflow.com/a/37040394/1413395), in Erwartung von Kritik. –

+0

@IntellectualKitty: Sie fragen, wie Sie etwas tun können, indem Sie eine andere Funktion als die verwenden, die für diese Aufgabe erstellt wurde. Kann ein Konvertierungsoperator einen Parameter nehmen? Natürlich kann es. Sonst was würde es konvertieren? Aber du versuchst einen quadratischen Pflock durch ein rundes Loch zu zwingen. Warum? _ "Ich möchte verhindern, dass [] meinen Code mit ... verunreinigt." Schreiben Sie einen Konstruktor, der wie 'RGBAColor (oldColor, someAlphaValue)' 'oder eine Elementfunktion' oldColor.changeAlpha (someAlphaValue) 'aufgerufen wird, die ein neues' RGBAColor' zurückgibt (Warnung: falscher Name; deutlicher machen, dass es nach Wert zurückgibt). –

Verwandte Themen