自动类型推导(auto)与类型获取(decltype)

auto

话说C语言还处于K&R时代,也有auto a = 1;的写法。中文译过来叫自动变量,跟 c++11 的不同,C 语言的 auto a = 1; 相当与 auto int a = 1; 语句。 而 C++11 的 auto 是有着严格的类型推导出来的。以前是这么写
int a = 1;
现在,编译器知道a是int型了。所以可以这么写
auto a = 1;
对于类型比较长的,如vector<string>::iterator这类的,能少敲些字符了。
如果仅仅就这点作用,那么对编程实在没什么太大的益处,虽然自动类型推导对于编译器而言,是个高大上的话题。实际上,作用远远不止这点啊。适当地使用 auto ,会是你的代码更优雅,举例说明:

template <typename BuiltType, typename Builder>
void makeAndProcessObject (const Builder& builder)
{
    BuiltType val = builder.makeObject();
    // do stuff with val
}

//从这代码来看,BuiltType的用处不大,但必须这么写才能编译过。有了auto后,你可以这么写
template <typename Builder>
void makeAndProcessObject(const Builder& builder)
{
     auto val = builder.makeObject();
     // do stuff with val
}

你可能会问,使用函数对象不是也可以吗?
是的,函数对象当然没问题,自己写的回调函数,你可以传个函数指针也没有问题。他们有优点也有缺点。函数对象能维护状态,但语法开销大,而函数指针语法开销小,却没法保存范围内的状态。如果你觉得鱼和熊掌不可兼得,那你可错了。lambda函数结合了两者的优点,让你写出优雅简洁的代码。

decltype

decltype 意为 declared Type,即声明类型。decltype(x) 表示从 x 中提取类型。因此,可以这样写:
decltype(x) y = x;
当然,x 也可以换成一个表达式,decltype(builder.makeObject()) 将得到 makeObject() 返回的类型。如果我们结合 auto 和 decltype 就可以写出如下代码:

template <typename Builder>
auto makeAndProcessObject(const Builder& builder) -> decltype(builder.makeObject())
{
     auto val = builder.makeObject();
     // do stuff with val
     return val;
}

这就是返回类型后置。从上面的例子可以看出,decltype对于模板编写会有所帮助。如果不用自己写模板的话,或许用的并不多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值