関数で使用する変数を参照していますが、int の場合と float の場合があります。変数の型 (int または float) を自動的に判断する方法を見つけましたが、後で参照するときに正しい型になるようにその変数を宣言する方法が必要です。あるタイプの変数を別のタイプにキャストできることは知っていますが、新しい変数を導入する必要があるようです。
何かご意見は?
関数で使用する変数を参照していますが、int の場合と float の場合があります。変数の型 (int または float) を自動的に判断する方法を見つけましたが、後で参照するときに正しい型になるようにその変数を宣言する方法が必要です。あるタイプの変数を別のタイプにキャストできることは知っていますが、新しい変数を導入する必要があるようです。
何かご意見は?
これがunionの目的です。次に例を示します。
union int_or_float
{
int i;
float f;
};
そしてあなたの機能で:
void function(int_or_float param, bool is_int)
{
if (is_int)
do_something_with_int(param.i);
else
do_something_with_float(param.f);
}
を使用しないでくださいunion
。
double
すべての場合において、その変数を aにします。
典型的な 64 ビットdouble
は、すべての 32 ビットint
値を正確に表すことができます。
Donald Knuth の格言を思い出してください。「時期尚早の最適化は諸悪の根源である」
また、Alexandrescu と Sutter の「小さなことを気にしないでください!」を思い出してください。
また、KISS の原則である「Keep It Simple, Stupid」を思い出してください。
そして、Reddit の群衆が、答えに否定的な認識があるために反対票を投じ始める前に、ウィキペディアで同じことを言っている百科事典にリンクする必要があります。
ユニオンを使用してください。構造体のように感じますが、メンバーの 1 つしか保持しません。たとえば、http ://www.go4expert.com/forums/showthread.php?t=15 を参照してください。
複雑な代替案を次に示します。
class Base { virtual ~Base() { } };
class Int : public Base { int a; };
class Float : public Base { float a; };
class Both {
public:
Base &choose(int i) {
switch(i) {
case 0: return my_int;
case 1: return my_float;
};
}
private:
Int my_int;
Float my_float;
};
次に、ベース参照で何かを行うのは、仮想関数または dynamic_cast のいずれかです。
追加の良いトリックは、それらの間に変換を追加することです。
void calc_int() {
my_int.a = (int)my_float.a;
}
void calc_float() {
my_float.a = (float)my_int.a;
}
そして、それはセッターの問題です:
void set(int a) {
my_int.a = a;
calc_float();
}
void set(float a) {
my_float.a = a;
calc_int();
}