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新特性之六——元编程
随机推荐
- Appium appium 基础之键盘处理
方法1 AppiumDriver实现了在上述功能,代码如下(java版本) driver.sendKeyEvent(66);方法2 HashMap keycode = new HashMap();ke ...
- js打印相关,注意此方法受到IE安全性设置影响
<HTML><HEAD><TITLE>javascript打印-打印页面设置-打印预览代码</TITLE> <SCRIPT language=j ...
- ST-LINK接口定义
ST-LINKIII管脚定义及接法: ST-LINK IIILED灯三种状态含义: 常亮:目标板与ST-LINK在SWIM模式或者JTAG/SWD模式下已经通讯初始化. 闪烁:目标板与ST-L ...
- UGUI [TextArea]
- (转)linux route命令深入浅出与实战案例精讲
linux route命令深入浅出与实战案例精讲 http://blog.51cto.com/oldboy/1119453 深入浅出之-route命令实战使用指南 http://blog.51cto. ...
- DEDE用{dede:sql}标签取出当前文档的附加表中的内容
最近在用DEDE做项目,遇到一个需求是要在article_image.htm模板中直接取出附加表addonimages中的某一记录的imgurls字段的内容.而这条记录是不断变化的,比如我点击了< ...
- 文本框只允许输入数字.net/javascript
<input type="text" name="test" onKeyUp="test1.value=(this.value=this.val ...
- Navicat连接Oracle数据库报错ORA-28547解决方法
先说明下我机器的环境: 1.Win10 - 64bit 2.Navicat Premium_11.2.7 - 64bit 3.未安装Oracle数据库(包括Client也未安装) 解决方法: 1.下 ...
- Spring-cloud微服务 Eureka学习教程-单服务器配置之快速搭建EurekaServer、EurekaClient(基础)
以下实例代码下载地址:https://github.com/wades2/EurekaDemo Eureka是Spring Cloud Netflix的一个子模块,也是核心模块之一.用于云端服务发现, ...
- Html+CSS--->第一周初探
html css 学了一周的前端,谈谈我的感想 我一直在使用sublime text 3来编辑我的代码,其中有很多很好用的快捷键和插件大大提高了我的开发效率 在这里我极力推荐使用编辑器来进行学习前端. ...