为什么要使用c ++ Typedef?

RoR*_*RoR 7 c++

我对typedef的理解是给一个声明一个别名.现在将这种int声明称为Integer.但为什么?为什么有人会使用typedef?什么是更有利的原因?

typedef int Integer;

Integer blamo = 50;

cout << blamo << endl;
Run Code Online (Sandbox Code Playgroud)

ten*_*our 19

这不是一个好例子,因为Integerint没有任何不同的含义.但想象一下,

typedef int BlamoType;
Run Code Online (Sandbox Code Playgroud)

现在,将来'blamo'变为64位整数时,您可以更改此typedef,并且所有其他代码保持不变.

typedef的另一个原因是缩短类型名称.例如,而不是

boost::shared_ptr<std::map<std::wstring, std::vector<int> > > blamo1;
boost::shared_ptr<std::map<std::wstring, std::vector<int> > > blamo2;
std::vector<boost::shared_ptr<std::map<std::wstring, std::vector<int> > > > blamoList;
Run Code Online (Sandbox Code Playgroud)

你可以做:

typedef boost::shared_ptr<std::map<std::wstring, std::vector<int> > > BlamoType;
BlamoType blamo1;
BlamoType blamo2;
std::vector<BlamoType> blamoList;
Run Code Online (Sandbox Code Playgroud)

  • 周杰伦:这与改变正常班级的内部结构有什么不同? (3认同)
  • @Jay不是任何封装的问题吗?你反对封装吗? (3认同)
  • 这也是 typedef 问题的一个很好的例子:“将来当‘blamo’成为 64 位整数时。” 当我的代码因为有人更改类型而中断时,如果不跟踪定义,我就无法看到。 (2认同)

ybu*_*ill 11

这里没有人提到的原因是:编写通用代码.考虑像某些容器的实现std::vector.它应该有一个类型,std::vector<T>::value_type所以任何编写通用代码的人都可以使用它:

template<class Container> void f(const Container &c)
{
    typename Container::value_type v = c.back();
    // ...
}
Run Code Online (Sandbox Code Playgroud)

你怎么能在课堂上介绍这样的类型?唯一的方法是typedef:

// !!!EXPOSITION ONLY!!!
template<class T> class vector
{
public:
    typedef T value_type;
    // ...
};
Run Code Online (Sandbox Code Playgroud)


phl*_*lip 7

所以你只需输入 boost::shared_ptr<std::map<std::string,std::string>> 一次?