`
guoyiqi
  • 浏览: 1002307 次
社区版块
存档分类
最新评论

如何用C++获取运行时变量的类型

 
阅读更多

在上秦小麟老师的数据库实现技术的时候,老师提到了一个问题:如何在运行时获取一个变量的类型,这用C实现好像要大费周折。今天正好碰到一个问题想看看C++STL中的sort算法的实现,发现里面有个技巧可以很容易做到这一点。我就立刻自己做了一个实验。如下可以获取运行时变量的类型。

其中心思想就是,运用模板函数的重载,是什么类型的参数就去调用参数是那个类型的函数。这样就让编译器去自己识别,而编译器当然知道每个变量的类型。这让我想去探究那些我经常用到的STL算法的实现,如果你也经常使用,何不借此机会好好研究一下呢?我感觉至少有几个好处。

1 增强对C++语言的理解

2 增强程序的设计能力

3 增强算法分析与设计的能力

#include<iostream>
using namespace std;

void PrintType(int t)
{
cout<<"int type";
}
void PrintType(char t)
{
cout<<"char type";
}
void PrintType(long t)
{
cout<<"long type";
}

template<typename T> inline
void ValueType(T t)
{
PrintType(t);
}

int main()
{
int a;
char c;
ValueType(a);cout<<endl;
ValueType(c);cout<<endl;
return 0;
}

上例的功能很容易扩展,如果你向自己的项目添加了一个新的类型,那么只要重载一个PrintValue( )即可。这仅仅是输出变量的类型,如果你还想再获取变量的类型的时候做更多的事情的话,显然也是很容易做到的。比如你想先获取变量的类型,这样之后才能确定分配给变量多少空间,那么这个也可以轻松实现,只需要改变PrintValue的功能即可。这里可以写一个int PrintValue(YourType t) ,她甚至应该有一个更好的名字比如int Memory(Type t)。

在不改变函数名的同时对上述函数稍加修改就可以实现输出传入参数应该分配的内存大小。

#include<iostream>
using namespace std;

int PrintType(int t)
{
cout<<"int type ";
return sizeof(int);
}
int PrintType(char t)
{
cout<<"char type ";
return sizeof(char);
}
int PrintType(long t)
{
cout<<"long type ";
return sizeof(long);
}

template<typename T> inline
int ValueType(T t)
{
return PrintType(t);
}

int main()
{
int a;
char c;
cout<<ValueType(a)<<" bytes need"<<endl;
cout<<ValueType(c)<<" bytes need"<<endl;
return 0;
}

分享到:
评论

相关推荐

    c++修改系统环境变量

    环境变量存储了与用户或系统相关的路径、配置和其他信息,这些信息可供程序在运行时使用。本篇文章将详细探讨如何在C++中实现这个功能,以及涉及的相关知识点。 首先,我们需要了解Windows API(应用程序接口)在...

    c++ 修改注册表设置环境变量

    在修改环境变量之前,先用这个函数获取当前的值。 3. `RegSetValueExA/H`: 这个函数用于设置注册表项的值。如果你想修改环境变量,可以调用此函数,将新的环境变量值传入。 4. `RegCloseKey`: 修改完注册表后,别...

    关于C++中char型变量的地址输出

    当我们使用`&`运算符获取变量的地址时,实际上是在获取该变量在内存中的确切位置。对于`char`型变量而言,它的地址可以被解释为指向单个字符的指针,而不仅仅是字符本身。 #### 5. 总结 通过本篇文章的学习,我们...

    C++运行时类型信息揭密

    ### C++运行时类型信息揭秘 #### 概述 C++是一种静态类型的编程语言,在编译阶段就已经确定了大部分的数据类型。然而,C++也支持动态类型信息查询和类型安全的转换,这主要通过`typeinfo`和`dynamic_cast`等机制来...

    class1-c++及汇编下的各种变量类型

    总的来说,“class1-c++及汇编下的各种变量类型”这个课程将涵盖C++和汇编语言中变量的定义、使用、内存布局以及它们在实际编程和逆向工程中的应用。通过学习,你可以深化对这两种语言的理解,增强代码编写和分析的...

    可运行,c++通过opc多读多写WinCC变量、KIngView中变量的写法。

    3. **读取变量**:使用SDK的读取函数,传入变量的OPC标识,获取变量的当前值。 4. **写入变量**:对于需要修改的变量,调用SDK的写入函数,传入新的值和变量标识,将数据写入到WinCC或KingView的变量中。 5. **...

    C++跨平台条件变量和互斥锁封装

    在C++编程中,跨平台性是一个重要的考量因素,尤其是当你需要在Windows和Linux等不同操作系统上运行同一段代码时。本示例着重讲解如何利用C++标准库中的互斥锁(mutex)和条件变量(condition variable)进行线程...

    Dev C++图形库环境变量

    标题提到的"Dev C++图形库环境变量"就是指为Dev C++配置这些图形库的过程,以便能够编写和运行使用图形的C++程序。 在C++中,图形库是用于处理图像、动画以及用户交互的关键组件。例如,OpenGL是一个强大的跨平台...

    C++获取IP地址代码

    3. **获取主机信息**:使用`gethostname()`函数获取本地主机名,然后用`gethostbyname()`或`getaddrinfo()`(推荐使用,因为它支持IPv6)获取主机的IP地址信息。 ```cpp char hostName[256]; gethostname(hostName,...

    C++获取计算机IP地址

    以上就是使用C++和Visual C++ 6.0获取计算机IP地址的基本步骤和关键知识点。实际开发中,可能还需要考虑多线程、异步处理等因素,但这里主要讲解了基础流程。希望这个教程对你有所帮助,让你更好地理解和应用相关...

    C++Primer 类型转化

    1. **`dynamic_cast`**:主要用于多态环境中的类型转换,支持运行时类型识别(RTTI)。 ```cpp class Base { }; class Derived : public Base { }; Base* base_ptr = new Derived(); Derived* derived_ptr = ...

    Visual C++代码 获取本地网络信息

    在本文中,我们将深入探讨如何使用Visual C++来获取本地网络信息,包括网络适配器名、网络适配器描述、物理(MAC)地址、IPv4和IPv6地址以及子网掩码。这些信息对于系统管理和网络诊断至关重要。 首先,我们要知道...

    c++ 完备的运行时类型信息(动态类型信息)

    C++的运行时类型信息(RTTI,Runtime Type Information)是C++标准库提供的一种机制,用于在程序运行时获取对象的实际类型信息。虽然C++的RTTI相对较弱,但仍然能够提供一些基础功能,例如`typeid`运算符和`dynamic_...

    爱心源码,C++实现,内附运行图片

    1. **头文件引用**:C++程序通常会引入头文件来获取必要的函数库和数据类型。在这个例子中,可能需要`&lt;iostream&gt;`(用于输入输出操作)和`&lt;graphics.h&gt;`(如果使用了旧版的Borland C++编译器的图形库)或者`...

    PB调用C++DLL

    4. **获取函数指针**:使用`GetProcAddress`函数获取DLL中特定函数的地址。你需要保存这个地址,因为在PB中不能直接调用DLL函数,而是通过函数指针。 5. **调用DLL函数**:通过函数指针调用DLL中的函数。对于参数...

    c/c++获取系统时间

    在C/C++编程语言中,获取系统时间是开发过程中的一项基本技能,尤其在制作日历或时钟等应用时显得尤为重要。本文将深入探讨如何利用C/C++来获取系统时间,包括不同方法的原理与实践。 ### 时间的概念 在计算机科学...

    c++中求程序运行时间

    在这个示例中,首先使用`time(NULL)`获取程序开始执行的时间戳并存储在`start`变量中。接着使用`system("pause")`命令使程序暂停,等待用户输入。再次调用`time(NULL)`获取新的时间戳并存储在`end`变量中。最后,...

    一键配置c/c++与c#缺少的运行库与环境文件

    总的来说,配置C/C++与C#的运行库和环境文件涉及多个步骤,包括选择合适的编译器、安装运行库、设置环境变量等。一键配置工具简化了这一过程,使得开发者能够更专注于编写代码,而非解决环境问题。然而,理解和掌握...

    笔记本电池状态容量显示代码 C++

    开发者可能使用VC++6.0的调试工具,如断点、单步执行、查看变量值等,来定位和修复程序中的问题。 10. **软件测试**:确保程序在各种硬件配置和操作系统版本上都能正确运行,是开发过程中的重要环节。开发者可能...

    使C++运行得更快的写法

    **知识点详解**:`cin`和`cout`虽然易于使用,但它们涉及更多的运行时检查和类型转换,这会降低程序的执行速度。相比之下,`scanf`和`printf`的实现更为底层,省去了很多额外的处理步骤,因此在处理大量数据时更为...

Global site tag (gtag.js) - Google Analytics