首页 > 其他分享 >类型萃取

类型萃取

时间:2024-08-27 20:52:34浏览次数:8  
标签:function struct int param 类型 using type 萃取

类型萃取

借用化学中的萃取概念,类型萃取即将混合类型中的部分类型提取出来。在C++中可以使用模板实现这个功能。

非类成员变量的类型萃取

对于变量混合类型如 int*const int 等,我们可以将 *const 去掉,只留下 int

template <typename T>
struct remove_pointer;

template <typename T>
struct remove_pointer<T*> {
    using type = T;
};

int main() {
    using type = remove_pointer<int*>::type; //using type = int
    return 0;
}
template <typename T>
struct remove_const;

template <typename T>
struct remove_const<const T> {
    using type = T;
};

int main() {
    using type = remove_const<const int>::type; //using type = int
    return 0;
}

对于上面两段代码,我们先声明了一个类模板,然后将这个类模版进行偏特化,这样就能使得特定的类型匹配这个模板的偏特化,从而将部分类型萃取出来。

非类成员函数的类型萃取

对于一个函数,我们可以使用类型萃取将它的返回值类型,参数类型提取出来。

假设我们有一个函数,它有一个参数

bool Foo(int) {
    return true;
}

我们可以用通过函数指针,用类似的的方法萃取函数的返回值类型和参数类型。

template <typename T>
struct function_traits;

template <typename Ret, typename Param>
struct function_traits<Ret (*)(Param)> {
    using ret_type = Ret;
    using param_type = Param;
};

int main() {
    using function_info = function_traits<decltype(&Foo)>;
    using ret = function_info::ret_type; //using ret = bool
    using param = function_info::param_type; //using param = int
    return 0;
}

若函数有不止一个参数,可以使用变长参数模板

bool Foo(int, double, bool) {
    return true;
}

template <typename T>
struct function_traits;

template <typename Ret, typename... Args>
struct function_traits<Ret (*)(Args...)> {
    using ret_type = Ret;
    using param_type = std::tuple<Args...>;
};

int main() {
    using function_info = function_traits<decltype(&Foo)>;
    using ret = function_info::ret_type; //using ret = bool
    using param = function_info::param_type; //using param = std::tuple<int, double, bool>
    return 0;
}

类成员类型萃取

对于一个类,带有成员变量和成员函数,由于类的成员的指针的特殊性,我们不能直接用上面的方法进行类型萃取,需要在模板的类型参数中额外记录类的信息。

比如,我们有下面的类

struct Person {
    bool IsFemale(int) { return true; };
    float height;
};

这个类中既有成员函数 IsFemale ,还有成员变量 height ,我们如何从类中萃取成员的类型信息?

template <typename T>
struct function_traits;

template <typename T>
struct variable_traits;

template <typename Ret, typename Class, typename Param>
struct function_traits<Ret (Class::*)(Param)> {
    using ret_type = Ret;
    using class_type = Class;
    using param_type = Param;
};

template <typename Type, typename Class>
struct variable_traits<Type(Class::*)> {
    using type = Type;
    using class_type = Class;
};

int main() {
    using function_info = function_traits<decltype(&Person::IsFemale)>;
    using function_ret = function_info::ret_type; //using function_ret = bool
    using function_param = function_info::param_type; //using function_param = int

    using variable_info = variable_traits<decltype(&Person::height)>;
    using variable_type = variable_info::type; //using variable_type = float
    return 0;
}

因为类的成员指针类型为 Class::* ,所以在模板中也要改成相应的格式。

以上就是类型萃取的方法,该方法在构建反射系统中有重要的作用。

标签:function,struct,int,param,类型,using,type,萃取
From: https://www.cnblogs.com/imyhy/p/18383521

相关文章

  • Linux 属主属组设置和文件类型
    今天给伙伴们分享一下Linux属主属组设置和文件类型,希望看了有所收获。我是公众号「想吃西红柿」「云原生运维实战派」作者,对云原生运维感兴趣,也保持时刻学习,后续会分享工作中用到的运维技术,在运维的路上得到支持和共同进步!如果伙伴们看了文档觉得有用,欢迎大家关注我的公......
  • C语言数据类型
    关键字的介绍数据类型关键字有12个:控制语句关键字有12个:存储类型关键字有4个:其他关键字有4个:字符和ASCII码的介绍数据介绍什么是数据类型?数据类型的具体组成字符:整形:浮点型布尔类型数据类型的取值范围关键字的介绍C语言的关键字有:1、数据类型关键字2、控制语......
  • C++与C语言中基础数据类型详解
    目录引言基础数据类型分类实际编程中的应用建议结论引言在C++与C语言的编程世界中,理解并正确使用基础数据类型是每个程序员的必备技能。不同的数据类型在内存中的占用和表示方式直接影响到程序的性能和行为。本文将详细介绍C++与C语言中常见的基础数据类型,探讨它们......
  • 数据库类型-下载-建立-查看-操作
    关系型数据库:oracle===》收钱,大型的公司msyql===》开源的免费的sqlserver===>微软非关系型数据库:hbase===>大数据‘Redismangdb下载mysql:yuminstallmysqlyuminstallmysql-serverrpm-qa|grep-imysql===》查看数据库有没有安装好servicemysqld......
  • 深入剖析二进制漏洞:原理、类型与利用方法
    目录引言1.1二进制漏洞简介1.2二进制漏洞的常见类型1.3二进制漏洞在CTF中的重要性缓冲区溢出2.1缓冲区溢出的基本原理2.2栈溢出攻击2.2.1EIP覆盖与ROP攻击2.2.2栈溢出的防御机制2.3堆溢出攻击2.3.1堆管理机制与漏洞利用2.3.2堆溢出的利......
  • sql优化-错误强制类型转换导致索引失效
    使用GaussDB数据库进行测试创建下面表,仅有一个字段a为integer类型。声明其为主键,数据库会默认为其建立索引。createtablet1(aintPRIMARYKEY);使用\d+查看表结构:gaussdb=#\d+t1Table"public.t1"Column|Type|Modifiers|......
  • WPF中如何根据数据类型使用不同的数据模板
    我们在将一个数据集合绑定到列表控件时,有时候想根据不同的数据类型,显示为不同的效果。例如将一个文件夹集合绑定到ListBox时,系统文件夹显示为不同的效果,就可以使用模板选择器功能。WPF提供了一个模板选择器类型DataTemplateSelector,它可以根据数据对象和数据绑定元素来选择 Dat......
  • 网站提示415 Unsupported Media Type:不支持的媒体类型怎么办
    当遇到“415UnsupportedMediaType”错误时,这意味着服务器无法处理请求中提供的媒体类型(MIME类型)。这种错误通常发生在发送POST、PUT或PATCH请求时,服务器期望某种特定类型的请求体,但客户端发送了不同类型的媒体。解决方案检查Content-Type头确认请求头中的 Conten......
  • C语言--类型转换
    数据的类型不同,在进行混合运算时会涉及到类型转换问题,转换的方法有哪些?一、自动转换:遵循一定的规则,由编译系统自动完成.(一)自动转换的原则:1、占用内存字节数少(取值范围小)的类型,向占用内存字节数多(取值范围大)的类型转换,目的是为了保证精度不降低.2、转换方向:3、当......
  • MySQL索引类型
    一、简介MySQL目前主要有以下几种索引类型:1.普通索引2.唯一索引3.主键索引4.组合索引5.全文索引二、语句CREATETABLEtable_name[col_namedatatype][unique|fulltext][index|key][index_name](col_name[length])[asc|desc]1.unique|fulltext为可选参数,分别表示唯一索引......