如何将模板typename作为字符串?

时间:2010-12-23 14:29:24

标签: c++ metaprogramming

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

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

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

4 个答案:

答案 0 :(得分: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 :(得分:1)

使用:

#include <typeinfo>

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

什么是typeid()。name()返回是与平台相关的,但是字符串可能代表你的类型。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

您唯一的选择是自己定义此反射,可能通过返回其具体类型的字符串表示形式的接口。

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