深入浅出C++11(7)-- 类型推导

在标准 C++(和 C ),使用参数必须明确的指出其类型。然而,随着模版类型的出现以及模板元编程的技巧,某物的类型,特别是函数定义明确的回返类型,就不容易表示。在这样的情况下,将中间结果存储于参数是件困难的事,可能会需要知道特定的元编程程序库的内部情况。

比如, 对map的遍历, 需要知道 iter的完整类型std::map<int,string>::iterator

    std::map<int,string> m;
    std::pair<int, string> p(1, "1");
    m.insert(p);
    for(std::map<int,string>::const_iterator iter = m.begin(); 
        iter != m.end(); iter++){
            int key = iter->first;
            string value = iterhttp://write.blog.csdn.net/postedit/12318621->second;
    }


C++11 提供两种方法缓解上述所遇到的困难.

auto

有被明确初始化的参数可以使用 auto 关键字, 这会依据该初始化子具体类型产生参数.

以上可以修改为:

auto iter = m.begin()

编译器可以根据初始化参数来确定真正类型:

//std::binder2nd<std::less<int>> pred = std::bind2nd(std::less<int>(), 100);
auto pred = std::bind2nd(std::less<int>(), 100);

//int v = 5;
auto v = 5;

除此之外,decltype 能够被用来在编译期决定一个表示式的类型。

decltype

decltype(m.begin()) iter = m.begin()

int v;
decltype(v) v2 = 5;

decltype 和 auto 一起使用会更为有用,因为 auto 参数的类型只有编译器知道。然而 decltype 对于那些大量运用运算符重载和特化的类型的代码的表示也非常有用

#include <vector>
 
int main()
{
  const std::vector<int> v(1);
  auto a = v[0];// a为int 型別
  decltype(v[0]) b = 0;   // b为const int& 型別,即
                      // std::vector<int>::operator[](size_type)const 的回返型別
  auto c = 0;         // c 为 int 型別
  auto d = c;         // d 为 int 型別      
  decltype(c) e;      // e 为 int 型別,c 尸体的型別 
  decltype((c)) f = e; // f 为 int& 型別,因为(c)是左值
  decltype(0) g;      // g为int型別,因为0是右值
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值