如何用C++获取变量的类型2.0版

        在上秦小麟老师的数据库实现技术的时候,老师提到了一个问题:如何在运行时获取一个变量的类型,这用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;  
} 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++程序员Carea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值