1、 decltype关键字

decltype被称作类型说明符,它的作用是选择并返回操作数的数据类型。

decltyoe有:①当使用decltype(var) 

    const int ci = 0, &cj = ci;

decltype(ci) x = 0;        // x的类型是const int

②当使用decltype(expr)

   int i = 42, *p = &i, &r = i; // r + 0是一个表达式 // 算术表达式返回右值 // b是一个int类型             decltype(r + 0) b;  // b是一个int类型

③当使用decltype(func_name) 更多的decltype的介绍和代码用法见                   【C++深陷】之“decltype”_不能自拔-CSDN博客_decltype            
   int add_to(int &des, int ori);
    FuncType *pf = add_to;
    pf(a, 2);// 通过函数指针调用add_to

2、decltype和declval的代码用法如下


void_t 判断 类型是否存在class T
{public:int test(){int a = 1;}
}
std::declval:将任何一个类型T转换成引用类型, 在不创建对象的情况下能达到创建对像的效果,
可以使 decltype 表达式中不必经过构造函数就能使用成员函数
eg: decltype(std::declval<T>.test())   //int 这里没有创建T的对象, 也没有执行a = 1;给定一个变量或表达式,decltype能够推导出他的类型。最重要的是能够不需要计算表达式就可以推导出表达式所得值的类型。
struct Default { int foo() const { return 1; } };
struct NonDefault
{NonDefault(const NonDefault&) { }int foo() const { return 1; }
}
decltype(Default().foo()) n1 = 1;                   // type of n1 is int//判断是否有这种类型
#define _HAS_TYPE_MEM_(parMTpNm)\
template<typename T, typename U = std::void_t<>>\
struct HTM_##parMTpNm: std::false_type{}; \
template<typename T>\
struct HTM_##parMTpNm<T, std::void_t<typename T::parMTpNm>>:std::true_type{};eg: std::cout<< _HAS_TYPE_MEM_<classname>::value << std::endl;
//or std::cout<< HTM_type<classname>::value << std::endl;//判断类是否有这种变量
#define _HAS_TYPE_VAR_(parMTpNm)\
template<typename T, typename U = std::void_t<>>\
struct HTM_##parMTpNm: std::false_type{}; \
template<typename T>\
struct HTM_##parMTpNm<T, std::void_t<decltype(T::var)>>:std::true_type{};//判断类中是否存在成员函数
#define _HAS_TYPE_FUN_(parMTpNm)\
template<typename T, typename U = std::void_t<>>\
struct HTM_##parMTpNm: std::false_type{}; \
template<typename T>\
struct HTM_##parMTpNm<T, std::void_t<decltype<T>().parMTpNm>>:std::true_type{};//
typename = int typename = char 等
优先于
typename = void
////// is_copy_assignable() 类对象是否可以拷贝复值
template<typename T, typename U = std::void_t<>>
struct ISCopyAssignable:std::false_type
{
};
template <typename T>
struct ISCopyAssignable<T, std::void_t<decltype(std::declval<T&>()/*临时变量*/ = std::declval<const T&>())> >:std::true_type
{
};std::declval<T&>()/*临时变量*/ = std::declval<const T&>()  它类似 T& operator= (const T &), 与前面一一对应,  结果为T&
//eg:
template<typename T, typename U, typename V = std::void_t<>>
struct IfCanAdd: std::false_type
{}template<typename T, typename U>
struct IfCanAdd<T, U, std::void_t<decltype(std::declval<T>() + std::declval<U>())>>:std::true_type
{}
/*template<typename T, typename U>struct VerAddRet{//    using type = decltype(T() + U())using type = decltype(std::declval<T>() + std::declval<U>());}
*/
template<typename T, typename U, bool = IfCanAdd<T, U>::value>//泛
struct VerAddRet
{using type = decltype(std::declval<T>() + std::declval<U>());
}template<typename T, typename U>//特
struct VerAddRet<T, U, false>
{}template<typename T, typename U>
std::vector<typename VerAddRet<T, U>::type> operator+(std::verctor<T> const&, std::verctor<T> const&)
{std::verctor<typename VerAddRet<T, U>::type> tmpvec;return tmpvec;
}struct elemC
{elemC(int i);elemC operator+(const elemC&t);
}
std::vector<elemC> vea;
std::vector<elemC> veb;
vea + veb;

上述部分内容转载于C++泛型编程学习 std::declval void_t_网瘾少年丶的博客-CSDN博客_declval 转载请附上原文出处链接和本声明。

详细介绍可以参考下面的文章

【C++深陷】之“decltype”_不能自拔-CSDN博客_decltypehttps://blog.csdn.net/u014609638/article/details/106987131

C++14尝鲜:decltype 和 decltype(auto)_zwvista的专栏-CSDN博客_decltypehttps://blog.csdn.net/zwvista/article/details/54571821

在C++11标准的语法中,auto被定义为自动推断变量的类型。

3、decltype和auto的区别如下:

#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{const int nCouta = 20;decltype(nCouta) nCountb = 30;auto nCountc = nCountb;cout << "nCounta " << nCouta << endl;cout << "nCountb " << nCountb << endl;//nCountb = 40; //保留的const特性nCountc = 40;   //不会保留const特性const int ci = 50;auto &ra = ci;//ra = 30;      //保留的const int &特性return 0;
}

如果要一次定义两个整型指针,int* a, b;这么做肯定是错的;若使用typedef就可以,

eg: typedef int* intPtr; intPtr a, b;//a b都是指针变量

C++11的std::declval与decltype相关推荐

  1. c++11:std::declval、decltype

    1.decltype是类型推导 #include <iostream>struct A { double x; }; const A* a;decltype(a->x) y; // ...

  2. c++11中的declval和decltype

    一.declval的介绍 std::declval定义在头文件中: template<class T> typename std::add_rvalue_reference<T> ...

  3. C++/C++11中std::priority_queue的使用

    std::priority_queue:在优先队列中,优先级高的元素先出队列,并非按照先进先出的要求,类似一个堆(heap).其模板声明带有三个参数,priority_queue<Type, C ...

  4. C++/C++11中std::string用法汇总

    C++/C++11中std::string是个模板类,它是一个标准库.使用string类型必须首先包含<string>头文件.作为标准库的一部分,string定义在命名空间std中. st ...

  5. 概率论中指数分布介绍及C++11中std::exponential_distribution的使用

    指数分布:在深度学习中,我们经常会需要一个在x=0点处取得边界点(sharp point)的分布.为了实现这一目的,我们可以使用指数分布(exponential distribution): p(x; ...

  6. C++11中std::tuple的使用

    std::tuple是类似pair的模板.每个pair的成员类型都不相同,但每个pair都恰好有两个成员.不同std::tuple类型的成员类型也不相同,但一个std::tuple可以有任意数量的成员 ...

  7. 用C++11的std::async代替线程的创建

    转自:http://www.cnblogs.com/qicosmos/p/3534211.html c++11中增加了线程,使得我们可以非常方便的创建线程,它的基本用法是这样的: void f(int ...

  8. 关于make提示must been abled with the -std=c++11 or -std=gnu++11 compiler options

    转:https://blog.csdn.net/zheng_weichao/article/details/78298928 在make后,出现错误,提示如下: /usr/include/c++/4. ...

  9. C++11中std::async的使用

    C++11中的std::async是个模板函数.std::async异步调用函数,在某个时候以Args作为参数(可变长参数)调用Fn,无需等待Fn执行完成就可返回,返回结果是个std::future对 ...

  10. C++11中std::packaged_task的使用

    C++11中的std::packaged_task是个模板类.std::packaged_task包装任何可调用目标(函数.lambda表达式.bind表达式.函数对象)以便它可以被异步调用.它的返回 ...

最新文章

  1. python使用matplotlib绘制水平条形图并在条形图上添加实际数值标签实战
  2. 5.3.6 虚拟地址、线性地址和物理地址之间的关系
  3. CMOS图像传感器——工作原理
  4. PyTorch框架学习三——张量操作
  5. ORACLE表、表分区、表空间的区别
  6. [数位DP]JZOJ 3363 Number
  7. 深入理解Plasma(一)Plasma 框架
  8. 嵌入式Linux要学哪些东西?你真的造吗
  9. 人工智能技术发展必须遵循的基本伦理原则
  10. 2018福大软工实践第七次作业
  11. VirtualBox虚拟机的samba也有问题
  12. 12864 c语言,单片机12864 c程序
  13. xcode9 免证书调试
  14. swift编程语言和c,Swift与Objective C对比:选择更快的开发语言
  15. Spring中AOP的实现原理
  16. 阿里巴巴價值觀(企業文化),江湖传说——阿里巴巴土话102句完整版
  17. html5 横向溢出隐藏,溢出:隐藏的HTML5视频
  18. input输入框输入中文时,需要计数input输入的汉字数,解决拼音输入的时候计数问题
  19. 如何制作企业招聘二维码?
  20. 旋转矩阵,矩阵,共轭矩阵

热门文章

  1. 移动端学习笔记(黑马教程)-基础概念
  2. git学习笔记(1-集中式与分布式版本控制工具对比)
  3. 数据结构最短路径例题_数据结构(五)图---最短路径(迪杰斯特拉算法)
  4. python怎么引入os模块的函数_Python之OS模块函数
  5. mysql查询每十分钟的数据_sql查询语句查询每10分钟的数据
  6. mysql内存淘汰_mysql内存数据淘汰机制和大查询会不会把内存打爆?
  7. 体育馆预约系统java_基于SSM框架下的JAVA体育场地预约系统
  8. 微光app电脑版_有哪些适合学生使用的 App?②
  9. Vue-购物车简单案例
  10. php定义枚举,PHP枚举