首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从decltype中删除类成员类型部分

是指在使用decltype关键字时,排除掉类成员的类型信息,只保留表达式的类型信息。

decltype是C++11引入的关键字,用于获取表达式的类型。在使用decltype时,如果表达式是一个类成员,那么decltype将返回该成员的类型,包括类成员函数、类成员变量等。

然而,在某些情况下,我们可能只关心表达式的类型,而不需要知道类成员的具体类型。这时,我们可以通过删除类成员类型部分来实现。

删除类成员类型部分的方法有多种,下面列举了两种常见的方法:

  1. 使用std::declval函数:std::declval是一个模板函数,可以用于获取一个类型的右值引用。通过使用std::declval函数,我们可以将类成员转换为一个右值引用,从而删除类成员类型部分。示例代码如下:
代码语言:txt
复制
class MyClass {
public:
    int myMember;
};

// 删除类成员类型部分
using TypeWithoutMember = decltype(std::declval<MyClass>().myMember);

在上述示例中,使用std::declval函数获取了MyClass类的myMember成员的类型,并将其赋值给TypeWithoutMember类型。这样就实现了从decltype中删除类成员类型部分。

  1. 使用std::remove_reference模板类:std::remove_reference是一个模板类,可以用于删除类型的引用修饰符。通过使用std::remove_reference模板类,我们可以删除类成员类型的引用修饰符,从而删除类成员类型部分。示例代码如下:
代码语言:txt
复制
class MyClass {
public:
    int myMember;
};

// 删除类成员类型部分
using TypeWithoutMember = std::remove_reference<decltype(MyClass().myMember)>::type;

在上述示例中,使用std::remove_reference模板类删除了MyClass类的myMember成员的类型的引用修饰符,并将其赋值给TypeWithoutMember类型。这样就实现了从decltype中删除类成员类型部分。

总结起来,从decltype中删除类成员类型部分可以通过使用std::declval函数或std::remove_reference模板类来实现。这样可以使得decltype只返回表达式的类型,而不包含类成员的类型信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

c++decltype_find的用法归纳

: 如果exp是一个不被括号()包围的表达式,或者是一个成员访问表达式,或者是一个单独的变量,decltype(exp)的类型和exp一致 如果exp是函数调用,则decltype(exp)的类型就和函数返回值的类型一致...z=0; ///total是A的一个int 类型成员变量,z被推导为int decltype(A.name) url="www.baidu.com";//url为stringleix return...int decltype(func4(1,2,3)) x=n;//x的类型为const int& decltype(func5()) y=0;//y的类型为const int&& exp调用函数时需要带上括号和参数...一个区分的简单方法是:对表达式取地址,如果编译器不报错就是左值,否则为右值 3.实际应用 的静态成员可以使用auto, 对于的非静态成员无法使用auto,如果想推导的非静态成员类型,只能使用...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除

27140

C++11 decltype 的用法

模版案例 更多细节问题 C++14 取消 decltype 其他 decltype 的意义 ---- 参考博客:C++11新标准:decltype关键字 有时我们希望表达式的类型推断出要定义的变量类型...同时在C++11typeid还提供了hash_code这个成员函数,用于返回类型的唯一哈希值。...decltype类型推导并不是像auto一样是变量声明的初始化表达式获得变量的类型,而是总是以一个普通表达式作为参数,返回该表达式的类型,而且decltype并不会对表达式进行求值。...推导规则 参考博客:C++11新标准:decltype关键字 如果e是一个没有带括号的标记符表达式或者成员访问表达式,那么的decltype(e)就是e所命名的实体的类型。...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除

24240

C++11-列表初始化变量类型推导范围forfinal&override默认成员函数控制

1、auto类型推导 2、decltype类型推导 四、范围for循环 五、final和override 1、final 2、override 六、默认成员函数控制 零、前言 本章将开始学习C++11...,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准 C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。...相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准约600个缺陷的修正,这使得C++11更像是C++98/03孕育出的一种新语言。...dynamic_cast只能应用于含有虚函数的继承体系 注:运行时类型识别的缺陷是降低程序运行的效率 decltype的使用: decltype是根据表达式的实际类型推演出定义变量时所用的类型...在C++对于空编译器会生成一些默认的成员函数,如果在显式定义了,编译器将不会重新生成默认版本 有时候这样的规则可能被忘记,最常见的是声明了带参数的构造函数,必要时则需要定义不带参数的版本以实例化无参的对象

70660

Modern c++快速浅析

decltype能够表达式推断出要定义的变量类型 decltype(a + b) i; //假设a是int而b是double,那么i的类型就是表达式(a + b)的类型,即double •当decltype...; // 等效于MyVector> v; 除此之外,using还可用于解决由于private或protected继承导致子类的对象无法访问父成员的问题...初学者选择typename可能会对模板有更好的了解(毕竟若模板传进来的是int,它是内置类型,看起来不是一个class) 进入正题,使用typename可以明确的告诉编译器,后面跟着的这个名字是类型成员...,解决了C++11无法“移动捕获”的问题(可以理解为是为Lambda生成的匿名创建并初始化成员) 假设有一个不可拷贝的对象需要被捕获进Lambda表达式,那么C++14就可以这么做 std::...那么我们可以认为这个Lambda所生成的匿名,含有一个char类型和一个指针类型(this指针),由于内存对齐的缘故,这个Lambda类型的大小是8个字节 // 假设这是编译器生成的匿名 class

17810

C++11特性_object.equals

decltype推导三规则 1.如果e是一个没有带括号的标记符表达式或者成员访问表达式(上例的(2)和(3)),那么的decltype(e)就是e所代表的实体的类型。...如果没有这种类型或者e是一个被重载的函数,则会导致编译错误。 2.如果e是一个函数调用或者一个重载操作符调用,那么decltype(e)就是该函数的返回类型(上例的 (1))。...//只有类型可以携带CV限定符,其他一般忽略掉CV限定符。...我们可以利用C++11标准库添加的模板is_lvalue_reference来判断表达式是否为左值: std::cout << std::is_lvalue_reference<decltype...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除

47330

【笔记】《深入理解C++11》(上)

有了extern后编译器会自动删除重复的实例化模板, 不但节省内存还节省了多余的实例化时间 注意被其他文件调用的外部模板一定要在要用到的实例化之前实例化 局部和匿名成员可以作为模板实参了, 但仍要注意匿名类型的声明不能在参数位置...没有继承关系) 的第一个非静态成员类型要与基不同(为了指针能直接指向第一个成员) 没有虚函数和虚基 所有非静态成员都满足POD布局(递归定义) 之所以C++11引入POD的概念是为了保证我们可以安全地用..., 例如当存在非POD成员且这个成员有非平凡的构造函数时, 这个union的默认构造将被删除 匿名的union对外是开放的, 因此放在的声明可以按照构造函数的不同而初始化为不同的类型, 此时被称为枚举式的...也就是decltype一个const对象时, 尽管对象本身的const类型能被获取, 但是从这个对象取出成员的const会丢失 5 提高类型安全 强类型枚举 普通的枚举enum代表对应到整数值的一些名字...(常量数值的别名), 0开始, 且其成员在所在的范围内全局可见 enum关于在编译期被替换, 不占用代码的储存空间, 曾被用作TMP的一种特殊常量声明, 称为enum hack 由于enum的全局可见性

1.9K20

C++11特性:decltype关键字

同时在C++11typeid还提供了hash_code这个成员函数,用于返回类型的唯一哈希值。...编译时类型推导的出现正是为了泛型编程,在非泛型编程,我们的类型都是确定的,根本不需要再进行推导。 而编译时类型推导,除了我们说过的auto关键字,还有本文的decltype。...decltype类型推导并不是像auto一样是变量声明的初始化表达式获得变量的类型,而是总是以一个普通表达式作为参数,返回该表达式的类型,而且decltype并不会对表达式进行求值。...; } decltype推导四规则 如果e是一个没有带括号的标记符表达式或者成员访问表达式,那么的decltype(e)就是e所命名的实体的类型。...我们可以利用C++11标准库添加的模板is_lvalue_reference来判断表达式是否为左值: cout ::

35860

C++11——引入的新关键字

decltype类型推导并不是像auto一样是变量声明的初始化表达式获得变量的类型,而是总是以一个普通表达式作为参数,返回该表达式的类型,而且decltype并不会对表达式进行求值[2]^{[2]}...2.1decltype推导规则 (1)如果e是一个变量或者成员访问表达式,假设e的类型是T,那么的decltype(e)为T,decltype((e))为T&。...nullptr和任何指针类型以及成员指针类型的空值之间可以发生隐式类型转换,同样也可以隐式转换为bool型(取值为false)。但是不存在到整形的隐式类型转换[3]^{[3]}。...调用标记了final的virtual函数,例如上面的B2::f,GNU C++ 前端会识别出,这个函数不能被覆盖,因此会将其的虚表删除。...delete 关键字可用于任何函数,不仅仅局限于成员函数。

1.4K50

深入解析decltypedecltype(auto)

decltype和auto在功能上大部分相似,但推导规则和应用场景存在一些区别,如用auto定义变量时必须提供初始值表达式,利用初始值表达式推导出类型并用它作为变量的初始值,而decltype定义变量时可以不需要初始值...是单变量的标识符、的数据成员、函数名称、数组名称时,推导出来的结果和expr的类型一致,并且会保留引用属性和CV修饰词,如下面的例子:int func(int, int) { int x;...(3)式定义的对象b虽然是const的,但成员x的类型是int类型,所以结果也是int。...(3)式也跟之前的结果不一样了,加上括号相当于返回的数据成员x,因此是一个左值,推导结果是一个引用,但因为定义的对象b是一个const对象,要保持它的内容不可被修改,因此引用要加上const修饰。...it_时还没有初始值,这时无法使用auto来推导它的类型,况且这里也无法使用auto来定义的数据成员,因为现在还不支持使用auto来定义非静态的数据成员的,但使用decltype却是可以的。

21720

万字长文带你掌握C++11auto和decltype的用法和区别

auto 不能作用于的非静态成员变量(也就是没有 static 关键字修饰的成员变量)。...当程序员使用 decltype(exp) 获取类型时,编译器将根据以下三条规则得出结果: 如果 exp 是一个不被括号( )包围的表达式,或者是一个成员访问表达式,或者是一个单独的变量,那么 decltype...& 类型 decltype(Student::total) c = 0; //total 为 Student 的一个 int 类型成员变量,c 被推导为 int 类型 decltype...(obj.x) a = 0; //obj.x 为成员访问表达式,符合推导规则一,a 的类型为 int decltype((obj.x)) b = a; //obj.x 带有括号,符合推导规则三...我们知道,auto 只能用于的静态成员,不能用于的非静态成员(普通成员),如果我们想推导非静态成员类型,这个时候就必须使用 decltype 了。

47910

C++11新关键字

decltype类型推导并不像auto变量声明的初始化表达式获得变量的类型,而总是以一个普通表达式作为参数,返回该表达式的类型,而且decltype并不会对表达式进行求值[2]^{[2]}[2]。...3.1decltype推导规则 (1)如果e是一个变量或者成员访问表达式,假设e的类型是T,那么的decltype(e)为T,decltype((e))为T&。...nullptr和任何指针类型以及成员指针类型的空值之间可以发生隐式类型转换,同样也可以隐式转换为bool型(取值为false),但是不存在到整型的隐式类型转换[3]^{[3]}[3]。...调用标记了final的virtual函数,例如上面的B2::f,GNU C++ 编译时会识别出来这个函数不能被重写,因此会将其的虚表删除。...delete 关键字可用于任何函数,不仅仅局限于成员函数。

3K10

Chapter 6:Lambda Expressions

closure class 是一个类型,一个closure可以该closure class实例化。每个lambda都会使得编译器产生一个独一无二的closure class。...() && pw->isArchived(); }; //直接使用表达式返回的右值对lambda内部成员变量进行初始化 规则: 指定lambda产生的闭包的数据成员名字...默认情况下,lambda表达式产生的闭包的内部成员函数operator(),是const属性的,这使得闭包里面的所有数据成员在lambda体内都是const属性的,而bind对象里面移动过来的data...T decltype作用在左值参数,得到左值引用类型;作用在右值参数,得到右值引用类型 std::forward函数T应该使用左值引用来暗示参数是左值,T应该使用非引用来暗示参数是右值 左值作用在通用引用...,得到左值引用参数;右值作用在通用引用参数,得到右值引用参数 尽管decltype在把右值参数推导为右值引用类型而不是非引用类型(std::forwardT要求的),但是最终转发的结果一样

1.7K50

C++11入门基础篇

相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准约600个缺陷的修正,这使得C++11更像是C++98/03孕育出的一种新语言。...使用迭代器方式遍历时,需要在迭代器类型前面加上typename关键字,指明这是一个类型名字。因为这个迭代器类型定义在一个模板,在该类模板未被实例化之前编译器是无法识别这个类型的。...C++11引入了基于范围的for循环,for循环后的括号由冒号分为两部分,第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。...array容器与普通数组不同之处就是,array容器用一个对数组进行了封装,并且在访问array容器的元素时会进行越界检查。...forward_list提供的删除函数叫做erase_after,也就是删除指定元素后面的一个元素,因为单链表如果要删除指定元素,还需要还要遍历链表找到指定元素的前一个元素,时间复杂度为O(N)。

8110

《逆袭进大厂》之C++篇49问49答(绝对的干货)

删除元素: 尾后删除:只有尾迭代失效。 中间删除删除位置之后所有迭代失效。 20、C和C++的区别 C++new和delete是对内存分配的运算符,取代了C的malloc和free。...}; 模板的部分特例化 不必为所有模板参数提供实参,可以指定一部分而非所有模板参数,一个模板的部分特例化本身仍是一个模板,使用它时还必须为其特例化版本未指定的模板参数提供实参(特例化时名一定要和原来的模板相同...,只是参数类型不同,按最佳匹配原则,哪个最匹配,就用相应的模板) 特例化部分成员 可以特例化部分成员函数而不是整个,举个例子: template class Foo...型不是int& 型 auto& p1 = y; //p1是int&型 auto p2 = &x; //p2是指针类型int* (2)decltype 有的时候我们还会遇到这种情况,我们希望表达式推断出要定义变量的类型...派生对基成员的访问形象有如下两种: 内部访问:由派生中新增的成员函数对继承来的成员的访问 外部访问:在派生外部,通过派生的对象对继承来的成员的访问 (二)继承权限 public继承

2.6K40

《逆袭进大厂》之C++篇49问49答

删除元素: 尾后删除:只有尾迭代失效。 中间删除删除位置之后所有迭代失效。 20、C和C++的区别 C++new和delete是对内存分配的运算符,取代了C的malloc和free。...}; 模板的部分特例化 不必为所有模板参数提供实参,可以指定一部分而非所有模板参数,一个模板的部分特例化本身仍是一个模板,使用它时还必须为其特例化版本未指定的模板参数提供实参(特例化时名一定要和原来的模板相同...,只是参数类型不同,按最佳匹配原则,哪个最匹配,就用相应的模板) 特例化部分成员 可以特例化部分成员函数而不是整个,举个例子: template class Foo...型不是int& 型 auto& p1 = y; //p1是int&型 auto p2 = &x; //p2是指针类型int* (2)decltype 有的时候我们还会遇到这种情况,我们希望表达式推断出要定义变量的类型...派生对基成员的访问形象有如下两种: 内部访问:由派生中新增的成员函数对继承来的成员的访问 外部访问:在派生外部,通过派生的对象对继承来的成员的访问 (二)继承权限 public继承

2K10
领券