以下代码在调用模板化函数时打印出字符串“T”而不是实际的类型名称。有没有办法获得真正的类型名称,而无需向模板类型添加任何内容?如何将模板化的类型名称作为字符串?
#define stringify(a) #a
#define tostring(a) stringify(a)
template <typename T>
void function_foo(T a, T b)
{
cout << tostring(T) << endl;
...
}
以下代码在调用模板化函数时打印出字符串“T”而不是实际的类型名称。有没有办法获得真正的类型名称,而无需向模板类型添加任何内容?如何将模板化的类型名称作为字符串?
#define stringify(a) #a
#define tostring(a) stringify(a)
template <typename T>
void function_foo(T a, T b)
{
cout << tostring(T) << endl;
...
}
模板不能像那样工作。在您的模板T
指定一个类型,而不是令牌序列:
typedef int lolztype;
typedef int lulztype;
function_foo<lolztype>(0, 0);
function_foo<lulztype>(0, 0); // calls the *same* template
没有办法分别获得lolztype
或lulztype
。你可以尝试的是使用typeid(T).name()
,但这不是非常有用,因为它不需要人类可读,甚至不需要为每种类型区分。
你可以尝试使用geordi's文件type_strings.hpp
,它可以在用GCC编译时打印出一个可读的字符串。
使用:
#include <typeinfo>
template <typename T>
void function_foo(T a, T b)
{
cout << typeid(a).name() << endl;
...
}
什么typeid的()名称()返回的是依赖。平台,但是是一个字符串可能代表你的类型。
实际上这在技术上是不正确的。从[手册](http://www.cplusplus.com/reference/typeinfo/type_info/name/): “返回可以标识类型的空终止字符序列。”。 所以它可能会或可能不会实际“代表您的类型”。 – 2017-05-25 04:20:25
有typeid
运营商。但请注意,name()
字符串是实现定义的。特别是,它通常涉及到一些名称混乱。一些实现还提供了另一种公共方法来获得“漂亮”字符串;检查您的<typeinfo>
标题。
#include <typeinfo>
template <typename T>
void function_foo(T a, T b)
{
std::cout << typeid(a).name() << std::endl;
// ...
}
你唯一的选择是自己定义这个反射,也许通过一个接口返回它的具体类型的字符串表示。
struct my_type : public reflects {
my_type();
static const std::string& type_name = "my_type";
};
重复数据删除:在这里看到http://stackoverflow.com/questions/1488186/stringifying-template-arguments – Abhay 2010-12-23 14:34:05
或http://stackoverflow.com/questions/4484982/how-to-convert-typename-t -to-string-in-c – 2010-12-23 14:35:21