模板参数类型为字符串

时间:2013-03-19 12:39:23

标签: c++ templates typeof

我有代码:

template<class T>
class MyClass{
    MyClass(){
       std::cout << MY_MACRO(T);
    }
};

是否可以编写将模板参数类型作为字符串返回的宏?如果是,怎么样?

例如,

MyClass<int> ins; // print 'int' to console

2 个答案:

答案 0 :(得分:2)

正如其他人提到的那样,你可以用RTTI做些什么,但我认为这不是你想要的:

#include <typeinfo>
#include <iostream>
#include <string>

#define MY_MACRO(obj) typeid(obj).name()

template<class T>
class MyClass {
    public:
        MyClass(){
            T b;
            std::cout << MY_MACRO(b) << std::endl;
        }
};

class TestClass {};

int main(int argc, char** argv) {
    MyClass<std::string> a;
    MyClass<int> b;
    MyClass<TestClass> c;
    return 0;
}

输出:

Ss
i
9TestClass

感谢来自@M M的评论 - 如果您使用的是gcc并且不介意将宏转换为函数,则可以使用abi::__cxa_demangle。您需要加入cxxabi.h

size_t size;
int status;
std::cout << abi::__cxa_demangle(typeid(obj).name(), NULL, &size, &status) << std::endl;

输出:

std::string
int
TestClass

答案 1 :(得分:1)

您可以使用重载函数,例如

std::string MY_MACRO(int) { return "int"; }

用作std::cout << MY_MACRO( T() );,但您需要为用作模板参数的每种类型定义此类函数。

或者您可以通过typeid函数使用运行时类型识别。