#include <iostream>
using namespace std;
typedef int num;
int main() {
num a, b;
cin >> a >> b;
cout << a + b;
return 0;
}
这样,如果我只需更改一行代码就可以将其更改为float或复数。
这是一个很好的做法吗?
答案 0 :(得分:3)
更有趣的问题是imho:你为什么要改变变量的类型?
因为你必须记住,即使像int和float这样的数值变量在某些情况下也会有不同的行为,每当你使用它作为这样的“通用”变量时,你需要考虑这些情况。
因此我倾向于说:不,它不是,因为副作用(特别是一旦项目比一个hello世界变得更大一点;))扮演太大的角色你可以改变类型< / p>
答案 1 :(得分:3)
我不会说这种风格很有用
typedef int num;
因为num
并不真正意味着更多,并且没有传授更多信息。但是,您所看到的是分离类型,例如
typedef long time_t
在这种情况下,在标准库中,使用time_t
而不是使用long表示秒数。该标准允许实现者在参数(包括浮点)内为此选择不同的类型。
所以,当你减少或指定类型的含义时,我会使用typedef,并且有几个选项可以满足该定义,并且你不希望任何人依赖于选择,而只是规范。 / p>
答案 2 :(得分:2)
听起来好像你正在寻找templates。
答案 3 :(得分:1)
理论上,从学术角度来看,答案可能是“是”。但在现实世界中,我发现答案几乎总是“不”,这就是原因。
你说你的理想是能够进行1行代码更改,例如从int
转换为float
,并完成。那会很好,但出于某种原因,它几乎从来没有实际可能。
考虑你的实际例子。如果你有这样的代码:
typedef int num;
...
num = 42;
...
if( 42 == num )
// MAGIC HAPPENS
...然后将其更改为:
typedef float num;
...代码可能会编译,但它无法正常工作。那是因为你不能只是将浮点数与常量变量进行比较以获得相等性。浮点数不精确,42f
的实际表示可能类似于41.99999999999999
,然后if( 42f == num )
将返回false。
其他例子无处不在。例如,在STL集合类中使用typedef
是一个很好的例子。如果你有这个:
typedef vector<string> strings;
strings my_strings;
...
my_strings.find("hello");
...您不能只将typedef更改为list<string>
,因为list
没有find
成员函数。
根据我的经验,typedef
对于保存输入最有用,从而可以节省潜在的错误,并且还可以使代码更具可读性。例如:
for( strings::iterator it = my_strings.begin(); it != my_strings.end(); ++it )
......可以说比以下更具可读性:
for( vector<string>::iterator it = my_strings.begin(); it != my_strings.end(); ++it )
...特别是当容器的类型变得越来越复杂时。
答案 4 :(得分:1)
在某些情况下,typedef
很重要。有一些技术,如Policy Clone。另请参阅Herb Satter在GotW #46中给出的理由:
<强> Typeability 强>
更短的名字
<强>可读性强>
typedef int (*Func)( int* );
Func t( int );
而不是
int ( *t(int) )( int* );
<强>可移植性强>
#if defined USING_COMPILER_A
typedef __int32 Int32;
typedef __int64 Int64;
#elif defined USING_COMPILER_B
typedef int Int32;
typedef long long Int64;
#endif