2010-12-23 87 views
1

以下代码在调用模板化函数时打印出字符串“T”而不是实际的类型名称。有没有办法获得真正的类型名称,而无需向模板类型添加任何内容?如何将模板化的类型名称作为字符串?

#define stringify(a) #a 
#define tostring(a) stringify(a) 

template <typename T> 
void function_foo(T a, T b) 
{ 
    cout << tostring(T) << endl; 
    ... 
} 
+1

重复数据删除:在这里看到http://stackoverflow.com/questions/1488186/stringifying-template-arguments – Abhay 2010-12-23 14:34:05

+0

或http://stackoverflow.com/questions/4484982/how-to-convert-typename-t -to-string-in-c – 2010-12-23 14:35:21

回答

3

模板不能像那样工作。在您的模板T指定一个类型,而不是令牌序列:

typedef int lolztype; 
typedef int lulztype; 

function_foo<lolztype>(0, 0); 
function_foo<lulztype>(0, 0); // calls the *same* template 

没有办法分别获得lolztypelulztype。你可以尝试的是使用typeid(T).name(),但这不是非常有用,因为它不需要人类可读,甚至不需要为每种类型区分。

你可以尝试使用geordi's文件type_strings.hpp,它可以在用GCC编译时打印出一个可读的字符串。

1

使用:

#include <typeinfo> 

template <typename T> 
void function_foo(T a, T b) 
{ 
    cout << typeid(a).name() << endl; 
    ... 
} 

什么typeid的()名称()返回的是依赖。平台,但是是一个字符串可能代表你的类型。

+0

实际上这在技术上是不正确的。从[手册](http://www.cplusplus.com/reference/typeinfo/type_info/name/): “返回可以标识类型的空终止字符序列。”。 所以它可能会或可能不会实际“代表您的类型”。 – 2017-05-25 04:20:25

1

typeid运营商。但请注意,name()字符串是实现定义的。特别是,它通常涉及到一些名称混乱。一些实现还提供了另一种公共方法来获得“漂亮”字符串;检查您的<typeinfo>标题。

#include <typeinfo> 
template <typename T> 
void function_foo(T a, T b) 
{ 
    std::cout << typeid(a).name() << std::endl; 
    // ... 
} 
0

你唯一的选择是自己定义这个反射,也许通过一个接口返回它的具体类型的字符串表示。

struct my_type : public reflects { 
    my_type(); 
    static const std::string& type_name = "my_type"; 
}; 
相关问题