如何用C++获取变量的类型2.0版
来源:互联网 发布:mac两根电源线 编辑:程序博客网 时间:2024/05/17 05:07
在上秦小麟老师的数据库实现技术的时候,老师提到了一个问题:如何在运行时获取一个变量的类型,这用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;
}
比较一般的方法
#include<iostream> #include<string> #include <limits> #include <iomanip>using namespace std; template<typename T>void print(void){ cout.setf(ios::left); cout <<setw(18)<< typeid(T).name()<<"字节[" << sizeof(T)<<"]"; cout << " 最小值["<<setw(20)<< (numeric_limits<T>::min)()<<"]" ; cout << " 最大值["<<setw(20)<< (numeric_limits<T>::max)()<<"]"; cout<< endl; }int main() { print<bool>(); print<char>(); print<signed char>(); print<unsigned char>(); print<wchar_t>(); print<short>(); print<int>(); print<unsigned>(); print<unsigned long>(); print<long long>(); print<float>(); print<double>(); print<size_t>(); return 0; }
- 如何用C++获取变量的类型2.0版
- 如何用C++获取运行时变量的类型
- 如何用Revit API获取Conduit、FlexPipe的类型
- 如何用C语言获取文件的大小
- 如何用C语言获取文件的大小
- 如何用C语言获取系统的用户登录名?
- 如何用C语言获取系统的sid信息?
- 如何用C语言获取文件的大小
- 如何用C#实时获取CPU利用率
- 如何用C#实时获取CPU利用率
- 如何用C#实时获取CPU利用率
- 如何用API从风管类型获取风管类型的截面形状
- 如何用javascript获取select的值
- 如何用.NET获取BO的token
- 如何用 DELPHI 获取 CPU 的序列号
- 如何用jquery获取文本框的值
- 【原创】C语言中如何用长度变量定义数组
- C语言中如何用指针变量指向多维数组
- 一步一步学习uCOS和ARM体系结构的心得
- JDBC详解
- CentOS系统时间与网络同步
- aix系统可以用改变时区的方法获取前后N天的日期
- 完美画质 3D游戏反锯齿技术浅析
- 如何用C++获取变量的类型2.0版
- [DB][ORACLE]SQL中使用WITH AS提高性能和可读性
- PHP 中执行排序与 MySQL 中执行排序效率比
- C++读入文件操作
- Flash Player的帧执行模型
- 非法的SQL语句
- 玻璃效果
- loadrunner学习笔记(Run-time setting 运行时设置)3
- 如何调用DLL (基于Visual C++6.0的DLL编程实现)