C++11 新特性之 decltypekeyword
版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/lr982330245/article/details/30728131
decltypekeyword用于查询表达式的类型。与其它特性结合起来之后会有意想不到的效果。
decltype的语法是
decltype (expression)
实例:
#include <iostream>
#include <typeinfo>
using namespace std;
int main()
{
int i;
double d;
float f;
struct A
{
int i;
double d;
};
decltype(i) i1;
cout << typeid(i1).name() << endl; //g++编译器下输出i ,相应int类型
decltype(d) d1;
cout << typeid(d1).name() << endl;//输出d, double
decltype(f) f1;
cout << typeid(f1).name() << endl;//输出f,float
A *a = new A;
decltype(a->i) i2;
cout << typeid(i2).name() << endl; //输出i, int
decltype(a->d) d2;
cout << typeid(d2).name() << endl; //输出d,double
return 0;
}
decltype在模板编程中的用处,举个样例,
template <class T, class U>
?
?? add(T t, U u)
{
return t+u;
}
问题在于无法知道t+u返回的实际类型
解决方法:利用__typeof__扩展编写相当难看的代码
template <class T, class U>
__typeof__(*(T*)0 + *(U*)0) add(T t, U u)
{
return t+u;
}
而在C++11中。我们能够使用autokeyword与decltype配合
#include <iostream>
#include <typeinfo>
using namespace std;
template <class T, class U>
auto add(T t, U u) ->decltype(t+u)
{
return t+u;
}
int main()
{
auto r = add(1, 1.0);
cout << typeid(r).name() << endl;
return 0;
}
C++11 新特性之 decltypekeyword的更多相关文章
- C++ 11学习和掌握 ——《深入理解C++ 11:C++11新特性解析和应用》读书笔记(一)
因为偶然的机会,在图书馆看到<深入理解C++ 11:C++11新特性解析和应用>这本书,大致扫下,受益匪浅,就果断借出来,对于其中的部分内容进行详读并亲自编程测试相关代码,也就有了整理写出 ...
- C++11新特性总结 (二)
1. 范围for语句 C++11 引入了一种更为简单的for语句,这种for语句可以很方便的遍历容器或其他序列的所有元素 vector<int> vec = {1,2,3,4,5,6}; ...
- C++11新特性总结 (一)
1. 概述 最近在看C++ Primer5 刚好看到一半,总结一下C++11里面确实加了很多新东西,如果没有任何了解,别说自己写了,看别人写的代码估计都会有些吃力.C++ Primer5是学习C++1 ...
- C++ 11 新特性
C++11新特性: 1.auto 2.nullptr 3.for 4.lambda表达式 5.override ...
- [转载] C++11新特性
C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而中文版维基百 ...
- 在C++98基础上学习C++11新特性
自己一直用的是C++98规范来编程,对于C++11只闻其名却没用过其特性.近期因为工作的需要,需要掌握C++11的一些特性,所以查阅了一些C++11资料.因为自己有C++98的基础,所以从C++98过 ...
- C++11新特性——range for
很多编程语言都有range for语法功能,自C++11起,终于将这个重要功能加入C++标准中.range for语句,可以方便的遍历给定序列中的每个元素并对其执行某种操作. 1.基本语法 for(d ...
- C++11新特性——大括号初始化
C++11之前,C++主要有以下几种初始化方式: //小括号初始化 string str("hello"); //等号初始化 string str="hello" ...
- C++11新特性之六——元编程
C++11新特性之六——元编程
随机推荐
- 在Pycharm上编写WordCount程序
本篇博客将给大家介绍怎么在PyCharm上编写运行WordCount程序. 第一步 下载安装PyCharm 下载Pycharm PyCharm的下载地址(Linux版本).下载完成后你将得到一个名叫: ...
- caffe 日志保存以及matlab绘制方法(windows以及ubuntu下)
caffe 用matlab解析日志画loss和accuracy clc; clear; % load the log file of caffe model fid = fopen('log-prev ...
- 16-----BBS论坛
BBS论坛(十六) 16.登录功能完成 (1)front/forms.py class SigninForm(BaseForm): telephone = StringField(validators ...
- SSL证书切换
SSL证书:SSL证书是数字证书的一种,类似于驾驶证.护照和营业执照的电子副本.因为配置在服务器上,也称为SSL服务器证书.SSL 证书就是遵守 SSL协议,由受信任的数字证书颁发机构CA,在验证服务 ...
- js学习笔记 -- 随记
js不区分整数和浮点数,统一用Number表示, js'=='比较会自动转换类型,会产生奇怪结果,'==='不会转换比较类型,如果不一致返回false,因此js判断始终用'===' `` 保留换行,也 ...
- Robot Framework 的安装和配置
Robot Framework 的安装和配置 在使用 RF(Rebot framework)的时候需要 Python 或 Jython 环境,具体可根据自己的需求来确定.本文以在有 Python 的环 ...
- SpringBoot---数据缓存(未完待续)
1.概述 1.1 在Spring中使用缓存的关键是配置CacheManager,而SpringBoot为我们自动配置了多个CacheManager的实现: 1.2 SpringBoot的CacheMa ...
- sklearn中常用数据预处理方法
1. 标准化(Standardization or Mean Removal and Variance Scaling) 变换后各维特征有0均值,单位方差.也叫z-score规范化(零均值规范化).计 ...
- python 下载图片
import requests from PIL import Image from io import BytesIO url = 'http://image2.buslive.cn/shp/upl ...
- Murano Weekly Meeting 2016.05.10
Meeting time: 2016.May.10 1:00~2:00 Chairperson: Serg Melikyan, from Mirantis Meeting summary: 1. m ...