如何获取类型名称

yk84 2011-08-11 09:43:04
template <typename T>
class CTest
{
public:
CTest() { std::cout << "打印出T的名称"; }
};


如何把T的名称获取到并打印出来?
...全文
228 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
独酌逸醉 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 akirya 的回复:]

C/C++ code
#include <iostream>
using namespace std;

template<class T>
struct Name
{
static const char* p;
};

template <typename T>
class CTest
{
public:
CTest() { std::cout << Name<T>::p <<e……
[/Quote]

小弟佩服。
luciferisnotsatan 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 demon__hunter 的回复:]

引用 5 楼 chinazhangjie 的回复:
想要动态获取类型的名称,貌似需要借用模板的实参演绎,个人技术有限不能给你段代码,期待高手的解答,lz也可以看看STL迭代器源码,里面就是用模板的实参演绎来解决这个问题的。

c++几乎不能动态的获取类型的名称,c++编译后生成的二进制文件中元数据少的可怜,不像java/c#等语言有丰富的元数据。作为特定的编译器,在实现rtti特性时,编译……
[/Quote]
++
机智的呆呆 2011-08-11
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;

template <typename T>
string GetType(T=T())
{
return "Unkown Type";
};
#define RegistType(type,typeInfo) template<> string GetType(type){return #typeInfo;}
RegistType(int,int);
RegistType(double,double);

template <typename T>
class CTest
{
public:
CTest()
{
std::cout << GetType<T>() <<endl;
}
};


int main( void )
{
CTest<int> x;
CTest<double> x0;
return 0;
}


参考7楼的
机智的呆呆 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 chinazhangjie 的回复:]
想要动态获取类型的名称,貌似需要借用模板的实参演绎,个人技术有限不能给你段代码,期待高手的解答,lz也可以看看STL迭代器源码,里面就是用模板的实参演绎来解决这个问题的。
[/Quote]
c++几乎不能动态的获取类型的名称,c++编译后生成的二进制文件中元数据少的可怜,不像java/c#等语言有丰富的元数据。作为特定的编译器,在实现rtti特性时,编译器会生成少量的关于类型和继承体系的元数据信息(比如vc,虚表指针指针指向位置的上面(低地址)4字节,有相关的RTTI信息)分析特定的编译器生成的元数据信息,可以实现针对特定编译器的动态类型名称获取的方法。
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

template<class T>
struct Name
{
static const char* p;
};

template <typename T>
class CTest
{
public:
CTest() { std::cout << Name<T>::p <<endl; ; }
};

#define NAME(x) template<> const char* Name<x>::p = #x;
NAME(int);
NAME(double);
//... 自己加对应的名字。

int main( void )
{
CTest<int> x;
CTest<double> x0;
return 0;
}
yk84 2011-08-11
  • 打赏
  • 举报
回复
还是要用RTTI吗。。有没有静态获取的办法呢
独酌逸醉 2011-08-11
  • 打赏
  • 举报
回复
想要动态获取类型的名称,貌似需要借用模板的实参演绎,个人技术有限不能给你段代码,期待高手的解答,lz也可以看看STL迭代器源码,里面就是用模板的实参演绎来解决这个问题的。
独酌逸醉 2011-08-11
  • 打赏
  • 举报
回复

#include <typeinfo>
#include <iostream>

template <typename T>
class CTest
{
public:
CTest() { std::cout << typeid( T ).name( ) << std::endl; }
};

int main()
{
CTest<int> t;
return 0;
}

用g++运行结果为

i


C++不能用的动态获取类型的名称。
品茶 2011-08-11
  • 打赏
  • 举报
回复
Mark
Michael_Xie 2011-08-11
  • 打赏
  • 举报
回复
std::cout << typeid(T).name() << endl;
飞天御剑流 2011-08-11
  • 打赏
  • 举报
回复

#include <typeinfo>
.......
template <typename T>
class CTest
{
public:
CTest() { std::cout << typeid( T ).name( ); }
};


64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧