Rücksendung unterschiedliche Daten je nach Typ der Daten (C++)
Gibt es trotzdem, so etwas zu tun?
(correct pointer datatype) returnPointer(void* ptr, int depth)
{
if(depth == 8)
return (uint8*)ptr;
else if (depth == 16)
return (uint16*)ptr;
else
return (uint32*)ptr;
}
Dank
- Wie wollen Sie dies zu nutzen? Chancen sind Ihr design folgt nicht, am besten OOP-Praktiken.
- Das Adobe Photoshop SDK ist das, was ich benutze, und Sie verwenden, void*
- Könnten Sie ein Beispiel zur Verwendung, darunter ein Anruf zu einem Photoshop-SDK-Funktion?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht. Der Rückgabetyp einer C++ - Funktion kann nur variieren, basierend auf expliziten template-Parameter oder die Arten Ihrer Argumente. Es kann nicht variieren, basierend auf der Wert Ihrer Argumente.
Jedoch, können Sie Sie mit verschiedenen Techniken zu erstellen, die einen Typ haben, der die Vereinigung von mehreren anderen Arten. Leider wird das nicht unbedingt helfen Sie hier, wie eine solche Technik ist ungültig * selbst, und zurück zu dem ursprünglichen Typ wird ein Schmerz sein.
Jedoch, indem Sie das problem von innen heraus können Sie bekommen, was Sie wollen. Ich denke, Sie würde wollen, verwenden Sie den code, den Sie geschrieben, als so etwas wie zum Beispiel:
Weil C++ muss wissen, die Art der p_pixels zur compile-Zeit, wird das nicht funktionieren. Aber was wir tun können, ist bitmap_operation selbst eine Vorlage, dann wickeln Sie es mit einem Schalter, basierend auf der Tiefe:
Nun der compiler generiert automatisch drei Implementierungen für bitmap_operation_impl für Sie.
Wenn Sie eine Vorlage verwenden können, argument statt eines normalen parameter, erstellen Sie eine Vorlagen-Funktion, die zurückgibt, den richtigen Typ für jeden
depth
Wert. Erstens muss es eine bestimmte definition des richtigen Typs nachdepth
. Definieren Sie eine Vorlage mit Spezialisierungen für die verschiedenen bit-Größen:Die diese definition kann verwendet werden, um zu erklären, eine vorgefertigte Funktion gibt, die die richtige Art für jedes bit mit dem Wert:
Können Sie reservieren Speicher auf dem heap und liefert ein void*, den du gewirkt hast an den Typ, der vergeben war. Seine gefährliche und unsichere Art zu arbeiten und ist ein Alter C-trick.
Kehren Sie könnten eine union, die enthält alle gültigen Datentypen (und eine Auswahl Indikator).
Könnten Sie Vorlagen verwenden, die den empfohlenen C++ Weg für diese Art der Sache.
Können Sie eine Reihe von überladenen Funktionen, die einen parameter (jeden Typs) als Referenz - der compiler entscheiden, welche Funktion aufgerufen wird, basierend auf den Datentyp. Ich bevorzugen Häufig diese Art und Weise, wie ich denke, die die einfachste.
Nein, Sie können nicht tun, dass in C++. Die richtige Antwort ist, zurück
void *
.Denken, es von der gegenüberliegenden Seite des Anruf -- und aus der compiler-Sicht bei, dass:
Wie würde der compiler in der Lage sein, zu überprüfen, ob der Rückgabewert korrekt verwendet wird (wie bei einer Variablen zugewiesen, von der richtigen Art, zum Beispiel), falls es nicht möglich zu wissen, welche der drei return-Typen zurückgegeben werden?
Zu diesem Zeitpunkt der Begriff " Zuweisung "einer von mehreren Typen", um die Rückkehr Wert bedeutungslos wird. Der return-Typ einer Funktion, die keinen anderen Zweck im Leben, als zu machen es möglich, den compiler zu tun, es ist Arbeit; der compiler muss "eins" geben zu können, führen die Typüberprüfung. Da Sie nicht wissen, welches es ist erst zur Laufzeit, der compiler kann das nicht der Typ der überprüfung für Sie. Sie haben zu sagen, der compiler zu "aufhören zu versuchen," zu entsprechen, der return-Wert auf einen bestimmten Typ Zeiger -- daher zurück ein
void *
.Wenn Ihr Tiefe Argumente, die zur Kompilierzeit bekannt ist, können Sie alternativ auch eine Reihe von Vorlagen wie @sth gezeigt, oder eine Reihe getrennter, voneinander Unabhängiger Funktionen, oder verwenden Sie eine Reihe von zusammenhängenden Funktionen, die Aufforderung eine gemeinsame Umsetzung-Funktion und Besetzung die Rückkehr auf den richtigen Typ. Welche Sie wählen ist oft eine ästhetische Entscheidung.
Wenn der Wert des
depth
ist nicht wissen, vor der Ausführung, dann sollten Sie wahrscheinlich zurückvoid *
.Nun, ich gehe davon aus, dass Ihre tatsächliche Umsetzung tatsächlich etwas zu produzieren, die Zeiger anderes als das, was dein Beispiel-code zeigt. Dein Beispielcode ist nicht eine tatsächliche Funktion; es ist mehr wie versuchen zu duplizieren, was eine
cast
tut. Eincast
ist nicht eine Funktion aufrufen; es ist eine compiler-Direktive, um zu versuchen, zu "machen" ist operand in einen bestimmten Typ (genau 'wie', ist eine lange Geschichte für einen anderen post). Es ist nicht die Sprache C++ Betrieb, aber ein compiler in Betrieb. Kann man nicht umschreiben, dass in C++ selbst.können Sie dies tun:
if(Tiefe==8)
(uint8*)returnPointer(void* ptr, int Tiefe){ //etc