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

相关文章

5分钟获取deepseek api并搭建简易问答应用

《5分钟获取deepseekapi并搭建简易问答应用》本文主要介绍了5分钟获取deepseekapi并搭建简易问答应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1、获取api2、获取base_url和chat_model3、配置模型参数方法一:终端中临时将加

Java中List转Map的几种具体实现方式和特点

《Java中List转Map的几种具体实现方式和特点》:本文主要介绍几种常用的List转Map的方式,包括使用for循环遍历、Java8StreamAPI、ApacheCommonsCollect... 目录前言1、使用for循环遍历:2、Java8 Stream API:3、Apache Commons

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

虚拟机与物理机的文件共享方式

《虚拟机与物理机的文件共享方式》文章介绍了如何在KaliLinux虚拟机中实现物理机文件夹的直接挂载,以便在虚拟机中方便地读取和使用物理机上的文件,通过设置和配置,可以实现临时挂载和永久挂载,并提供... 目录虚拟机与物理机的文件共享1 虚拟机设置2 验证Kali下分享文件夹功能是否启用3 创建挂载目录4

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

linux报错INFO:task xxxxxx:634 blocked for more than 120 seconds.三种解决方式

《linux报错INFO:taskxxxxxx:634blockedformorethan120seconds.三种解决方式》文章描述了一个Linux最小系统运行时出现的“hung_ta... 目录1.问题描述2.解决办法2.1 缩小文件系统缓存大小2.2 修改系统IO调度策略2.3 取消120秒时间限制3

Linux alias的三种使用场景方式

《Linuxalias的三种使用场景方式》文章介绍了Linux中`alias`命令的三种使用场景:临时别名、用户级别别名和系统级别别名,临时别名仅在当前终端有效,用户级别别名在当前用户下所有终端有效... 目录linux alias三种使用场景一次性适用于当前用户全局生效,所有用户都可调用删除总结Linux

Mybatis官方生成器的使用方式

《Mybatis官方生成器的使用方式》本文详细介绍了MyBatisGenerator(MBG)的使用方法,通过实际代码示例展示了如何配置Maven插件来自动化生成MyBatis项目所需的实体类、Map... 目录1. MyBATis Generator 简介2. MyBatis Generator 的功能3