Ich bin nicht sicher, warum Sie einen praktisch nicht typisierten Rückgabewert mit void*
verwenden, aber nehmen wir an, dass es Gründe dafür.
Es gibt eigentlich zwei Probleme, nämlich das Array zu erstellen und es dann zu verwenden.
Wenn Sie ein Array von verschiedenen Typen basierend auf einer Logik erstellen, müssen Sie sich irgendwie mit if
oder switch()
befassen; Wie sonst würden Sie die Logik ausdrücken, die den gewünschten Ergebnistyp bestimmt? Aber, wenn Sie möchten, können Sie auch etwas wie result = malloc(nrOfItems*sizeOfItem)
verwenden und sizeOfItem
für jede Logik bestimmen, die Sie mögen, sogar basierend auf arithmetischen Berechnungen.
Die interessantere oder kritischere Sache ist, wie der Aufrufer das Ergebnis der jeweiligen Funktion verwenden soll, da der Zugriff auf die Elemente eines Arrays Wissen über den Typ oder die Größe der Elemente in ihm erfordert.
Nehmen wir zum Beispiel den folgenden Code:
void* getSomeItems() {
if (std::rand() > 100000)
return new char[200];
else
return new double[200];
}
int main() {
void* someItems = getSomeItems();
double c = ((double*)someItems)[199]; // Critical!
// how shall we know if element type is double?
// if rand() decided to create items of type char,
// this code accesses non allocated memory
...
So können, wenn Ihre Funktion, auf dem die Informationen zurückgeben Art (und eigentlich auch die Größe des Arrays), der Rückgabewert erstellt wurde ist fast überflüssig.
würde ich vorschlagen, nicht void*
für diesen Einsatz. Wenn Sie den Typ vor dem Aufruf der Funktion kennen, können Sie Vorlagen, Vektoren oder andere Dinge verwenden. Wenn Sie den Typ und/oder die Größe vor dem Aufruf nicht kennen, geben Sie eine Struktur zurück, die neben dem zugewiesenen Array auch Informationen zu Typ/Größe enthält.
BTW: vergessen Sie nicht, das Ergebnis am Ende delete[]/free
. vielleicht
[boost :: variant] (http://www.boost.org/doc/libs/1_63_0/doc/html/variant.html). –
Verwenden Sie Schalter, wenn Ihr Problem nur 'if/else' ist – Raindrop7
Vorlage Spezialisierung – nikau6