typedef是否有助于提高可扩展性

时间:2011-03-31 15:28:10

标签: c++

#include <iostream>
using namespace std;

typedef int num;

int main() {
    num a, b;
    cin >> a >> b;
    cout << a + b;
    return 0;
}

这样,如果我只需更改一行代码就可以将其更改为float或复数。

这是一个很好的做法吗?

5 个答案:

答案 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