ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【无标题】

2022-01-16 14:04:30  阅读:140  来源: 互联网

标签:return int 无标题 ClassFunc test decltype 萃取


1. decltype是c++11以后出现的一个新的关键字,是用来萃取表达式或者变量或者函数返回值的类型的。

具体用法可以参考官网:https://en.cppreference.com/w/cpp/language/decltype

2. declval是c++11中的一个模板函数,原型如下:

具体用法可以参考官网:https://zh.cppreference.com/w/cpp/utility/declval

template<class T>
typename std::add_rvalue_reference<T>::type declval() noexcept;

将任意类型 T 转换成引用类型,令在 decltype 表达式中不必经过构造函数就能使用成员函数。

3.使用案例

#include <type_traits>
#include <utility>
 
int func(int){return 0;} //普通函数
typedef int(*pFunc)(); //函数指针
typedef int(&refFunc)(); //函数引用
struct ClassFunc
{
    char operator()(int) { return '0'; }
    int operator()(bool) { return 0; }
    int test() { return 0; }
    float test(int) { return 0; }
    static double test(float) { return 0; }
 
    float MyFunc(int) { return 0; }
    static int MyTest(int) { return 0; }
};
 
void main()
{
    int a;
    int b;
    decltype(a) c; //int
    //双层括号的,则解析为int&
    decltype((a)) cc = c; //int&
    decltype(a + b) d; //int
 
    //萃取一个有参函数的返回值时,需给参数传值,不能写成func(int)
    decltype(func(0)) e; //int
 
    //这里萃取到的是一个函数指针,没有理解
    decltype(pFunc()) f;//int(*)();
 
    auto lambdaFunc = []()->int {return 0; };
    /*
    这个必须还要把lambdaFunc赋值给ff,否则就报错
    无法引用 "lambda []()->int"的默认构造函数--它是已删除的函数,无法构造lambda实例
    */
    decltype(lambdaFunc) ff= lambdaFunc;
 
    //类构造一个匿名对象,然后萃取该匿名对象的类型
    decltype(ClassFunc()) g; //ClassFunc
 
    /*萃取ClassFunc::operator()(int)的返回类型,通过调用成员函数的方式来触发萃取*/
    decltype(ClassFunc()(0)) h; //char
    decltype(ClassFunc()(false)) i; //int
    decltype(ClassFunc().test()) j; //int
    decltype(ClassFunc().test(0)) k; //float
    //因为是静态成员函数,所以可以直接通过类的方式来调用,从而萃取返回类型
    decltype(ClassFunc::test(1.2f)) m; //double
    decltype(ClassFunc().test(1.2f)) n; //double
 
    /*当ClassFunc的构造函数为私有的时候,那么是不能通过构造一个对象去调用函数,然后萃取返回类型的。
    此时需要 declval 来转换一个引用类型,然后调用类成员函数。
    */
    decltype(std::declval<ClassFunc>().test(0)) p; //float
}

标签:return,int,无标题,ClassFunc,test,decltype,萃取
来源: https://blog.csdn.net/TwoTon/article/details/122522512

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有