2012-03-30 3 views
0
zurück

Ich habe eine Funktion, die genau die gleichen Argumente annimmt, aber manchmal möchte ich, dass sie ein Double zurückgibt, und manchmal möchte ich, dass sie ein int zurückgibt. Was ist der richtige Weg, das zu tun?C++ Gibt double oder int von der Funktion

Ich könnte Funktion Überladung tun, aber die Deklarationen von überladenen Funktionen müssen voneinander durch die Typen und/oder die Anzahl der Argumente in der Liste der Argumente unterscheiden. Diese wären identisch, so dass Funktionsüberladung nicht zutrifft (glaube ich nicht).

double calc(int value, int add, double mult) 
{ 
    // Sometimes I want this to return int. Sometimes double. 
    return (value + add) * mult; 
} 

würde ich eher nicht int gegossen, wenn das die Art ist, erwarte ich oder zwei Funktionen schreiben (einen für ints, die andere für Doppelzimmer). Danke für jeden Hinweis.

+2

Können Sie näher erläutern, unter welchen Umständen Sie ein 'int' gegen ein' double' wollen? – templatetypedef

+0

Wie würden Sie diese Funktion verwenden? Können Sie Beispiele für beide Fälle angeben? – Andre

+0

@templatetypedef - Ja, manchmal ist der mult arg 1.0, zu anderen Zeiten ist es 1.375 usw. Wenn es 1.0 ist, möchte ich einen int zurückgeben. Wenn es 1.375 ist, möchte ich ein Double zurückgeben. – 01100110

Antwort

5

Sie können eine zweite Funktion erstellen:

int calcInt(int value, int add, double mult) { 
    return calc(value, add, mult); 
} 

Oder können Sie eine Vorlage verwenden:

template <class myType> 
myType calc(int value, int add, myType mult) { 
    return (value + add) * mult; 
} 

Sie können nicht eine andere Funktion mit dem gleichen Namen und Argumenten schaffen; Der Compiler würde nicht wissen, welchen Sie aufrufen wollten.

+0

Persönlich würde ich die "calcInt" Version bevorzugen, die andere ist nicht explizit genug aus Sicht der Codelesbarkeit. Es kann Logik-/Genauigkeitsprobleme weiter unten in der Spur maskieren. – JoshG

+0

Einverstanden. Aber manchmal ist es hilfreich zu wissen, was die Optionen sind. –

5
template <typename T, typename U> 
T calc (const int value, const int add, const U mult) 
{ 
    return static_cast<T> ((value + add) * mult); 
} 

calc<double> (1, 2, 1.7); // returns double 
calc<int> (1, 2, 3.4); // returns int 
+0

Danke, ich möchte calc (1, 2, 1.0); um int und calc (1, 2, 1.375) zurückzugeben; ein Doppel zurückgeben. Der Multarg wird immer 1,0 oder 1,375 sein. Es ist nie nur 1. – 01100110

+0

Ich habe die Antwort aktualisiert. Das sollte jetzt funktionieren. – Anteru

1

Angenommen, dies ist für Präzision oder so ähnlich beibehalten, würde ich meine eigene Art definieren - Number oder so etwas, und verwalten, ob es eine int oder intern verdoppeln.

+0

Es ist eine Art damit verbunden. Eine aufrufende App möchte einen Int. Ich gebe es 1.0 und es flippt aus, weil es 1, nicht 1.0 erwartet, also habe ich versucht, die Funktion 1 zurückzugeben, wenn die aufrufende App einen Int will. – 01100110

1

tun Sie es einfach als ein Doppel oder verwenden Sie eine Vorlage und lassen Sie den Compiler es herausfinden.

Wenn Ihr int = 1 Dann double = 1,0

Sie sind die gleiche Anzahl und Doppel wird mit der Präzision helfen.

Lassen Sie es einfach ein Doppel zurückgeben. Es verwendet mehr Speicher, aber es ist lokaler Bereich, also wen interessiert das?

Verwandte Themen