2012-03-30 11 views
0

私は全く同じargsをとる関数を持っていますが、doubleを返すことがあり、intを返すことができます。それを行う適切な方法は何ですか?C++関数からdoubleまたはintを返します。

私は関数のオーバーロードを行うことができますが、オーバーロードされた関数の宣言は、引数リストの型および/または引数の数によって異なる必要があります。これらは同一であるため、関数のオーバーロードは適用されません(私は思っていません)。

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

私はむしろ、それは私が期待するかの二つの機能(int型のための1、ダブルスのために他を)書くタイプだ時にint型にキャストしていないと思います。アドバイスありがとう。

+2

「int」と「double」をどのような状況で具体化できますか? – templatetypedef

+0

どのようにその機能を使用しますか?どちらの場合にも例を挙げることができますか? – Andre

+0

@templatetypedef - はい、時々mult argは1.0、それ以外は1.375などです。1.0のときはintを返したいと思います。それが1.375のときは、私は二重を返したい。 – 01100110

答えて

5

あなたは第二の機能を作成することができます

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

それとも、テンプレートを使用することができます

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

あなたが同じ名前と引数を持つ別の関数を作成することはできませんが。コンパイラはあなたが呼び出したいものを知りませんでした。

+0

個人的には、私は "calcInt"バージョンを好むでしょう、他のコードreadabilitytyの観点から十分に明示的ではありません。ロジック/精度の問題をトラックの下に隠す可能性があります。 – JoshG

+0

合意。しかし、オプションが何であるかを知ることは時として役立ちます。 –

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

ありがとう、私はcalc(1、2、1.0)が必要です。 intとcalc(1、2、1.375)を返す。ダブルを返す。マルチargは常に1.0または1.375になります。それは決して1ではありません。 – 01100110

+0

私は答えを更新しました。それは今働くはずです。 – Anteru

1

これは、精度またはそのような何かを維持するためであると仮定すると、私は自分のタイプ定義します - Numberまたはそのような何かを、それが内部的にint型またはdoubleであるかどうかを管理。

+0

それはそれに関連しています。呼び出し元のアプリケーションでintが必要です。私は1.0を与えるとそれは1.0ではなく1を期待しているので、それはフリークアウトしているので、呼び出し元のアプリケーションがintを必要とするときに関数を1に戻そうとしていました。 – 01100110

1

ちょうどそれをダブルとして実行するか、テンプレートを使用してコンパイラに把握させてください。

もしあなたのint型= 1 次にダブル=

1.0は、彼らが同じ数であり、二重のは、正確に役立ちます。

ただ二重に戻してください。それはより多くのメモリを使用しますが、ローカルスコープなので誰が気にしますか?

関連する問題