1

I am referencing a variable for use in a function and there are times it might be an int and times it might be a float. I have figured out a way to automatically tell which type I want the variable to be (either an int or a float) but I want a way to declare that variable so that when it is referenced later it will be the correct type. I know that you can cast one type of variable into another but it seems that it requires a new variable to be introduced.

Any thoughts?

4

4 回答 4

3

这就是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);
}
于 2012-09-02T22:31:14.593 回答
2

不要使用union.

double在所有情况下都将该变量设为 a 。

典型的 64 位double可以准确地表示所有 32 位int值。

记住 Donald Knuth 的格言,“过早的优化是万恶之源”

另外,请记住 Alexandrescu 和 Sutter,“不要为小事出汗!”。

另外,请记住 KISS 原则,“保持简单,愚蠢”。

在 Reddit 人群开始因为被认为是负面的回答而开始投票之前,我最好链接到一个百科全书,上面说同样的内容,嘿,维基百科中的 KISS

于 2012-09-02T22:34:23.293 回答
1

使用工会。它感觉有点像一个结构,但它只包含一个成员。例如,参见:http ://www.go4expert.com/forums/showthread.php?t=15 。

于 2012-09-02T22:31:32.863 回答
0

这是一个复杂的替代方案:

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 对 Base 引用做任何事情。

另一个好技巧是在它们之间添加转换:

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();
}
于 2012-09-02T22:43:51.423 回答