C++ typeof基本应用方式解析

2024-02-27 19:08

本文主要是介绍C++ typeof基本应用方式解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • C++ typeof在实际编程中主要就是帮助开发人员获取表达式的值的类型,并且还能获取表达式的类型。我们将会在这里为大家详细介绍其中的内容。
  •  

    C++编程语言可以被看做是C语言的升级版本。它不但拥有C语言的各种特性,而且还在一些特定方面上有所改进,使得开发人员在编程中大大提高了开发效率。我们在这里会为大家详细讲解一下有关C++ typeof的应用方法。

    一、基本用法。

    1、C++ typeof表达式。

    以下是它列出的用法:

    a、取表达式的值的类型:

      
    1. template< class A, class B> 
    2. function operator*(A a, B b) -> typeof(a*b); // return type last  
    3. // big change: function keyword  
    4. // : and return are obvious alternatives for -> 
    5. template< class A, class B> 
    6. typeof(a*b) operator* (A a, B b) ; // “lookahead parsing” 

    typeof(a*b)并不真的计算a*b的值,而是获得计算的结果类型。

    b、取表达式的类型:

      
    1. template< class A, class B> 
    2. typeof(A*B) operator*(A a, B b); // use typenames  
    3. // not general  
    4. template< class A, class B> 
    5. typeof((*(A*)0)*(*(B*)0)) operator*(A a, B b); // hack 

    目前好像只有gcc编译器支持这个关键字。

    2、auto关键字。

    auto在老的语法中,是标识存储类型的,表明此变量在本代码块范围内有效,这是默认属性,可以不写,所以感觉有点多余。

    在c++0x中,auto有了新用法,它的作用和C++ typeof相似,用法如下:

      
    1. template< class A, class B> typeof(a*b) operator*(A a, B b)  
    2. {  
    3. auto x = a*b; // avoid replication of expression/type  
    4. // …  
    5. return x;  
    6. }  
    7. auto glob = x*y; 

    看来它的作用是节省代码的,完全可以用C++ typeof代替。

    二、使用。

    从上面的基本用法就知道,以往难以处理的不同类型运算问题,它都能轻松处理。

    在其它场合,它也能派上用场。比如,我前段时间碰到的一个问题,比如下面一个普通类:

      
    1. struct A  
    2. {  
    3. int test ();  
    4. }; 

    在另一个类中,想要创建一个兼容A::test类型的委托(自定义的委托类):

      
    1. struct B  
    2. {  
    3. Delegate < int()> test;  
    4. }; 

    好象很容易就完成了。不过假如我的类A有10个方法,要在类B中定义10个委托呢?而且还要应对类A中可能发生的变化。于是我使用了宏来辅助产生类B:

      
    1. BEGIN_DEFINE(B) // struct B{  
    2. METHOD(A,test) // Delegate< ...> test;  
    3. ...  
    4. END_DEFINE() // }; 

    METHOD宏就是根据参数中指定的类和方法,产生委托的定义。如何得到A::test的类型?

    A::test本身在C++中是个不能确定类型的东西,除非它是static,而&A::test则是一个指针值。还是那个问题,如何得到它的类型?

    试图使用traits类模板来分离类型?注意模板类在使用时必须先给出模板参数,只有模板函数可以自行推导出模板参数的类型,而函数不可能出现在类的声明中。

    好了,废话不多说了,其实使用C++ typeof是比较简单的实现方法:

      
    1. template < class T> 
    2. class TypeTraits  
    3. {  
    4. TypeTraits (); // not implemented  
    5. };  
    6. //多个偏特化版本中的一个  
    7. template < class T, class Ret> 
    8. struct TypeTraits <  Ret(T::*)() > 
    9. {  
    10. typedef Delegate < Ret()> type;  
    11. }; 

    上面的METHOD可以定义为:

      
    1. #define METHOD(T,x) TypeTraits< typeof(&T::x)>::type x; 

    这是目前我找到的唯一一个方法,先记录下来。以上就是对C++ typeof的具体应用方法的介绍。

这篇关于C++ typeof基本应用方式解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/753324

相关文章

gradle第三方Jar包依赖统一管理方式

《gradle第三方Jar包依赖统一管理方式》:本文主要介绍gradle第三方Jar包依赖统一管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景实现1.顶层模块build.gradle添加依赖管理插件2.顶层模块build.gradle添加所有管理依赖包

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

Linux之systemV共享内存方式

《Linux之systemV共享内存方式》:本文主要介绍Linux之systemV共享内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、工作原理二、系统调用接口1、申请共享内存(一)key的获取(二)共享内存的申请2、将共享内存段连接到进程地址空间3、将

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合