我有代码:
template<class T>
class MyClass{
MyClass(){
std::cout << MY_MACRO(T);
}
};
是否可以编写将模板参数类型作为字符串返回的宏?如果是,如何?
例如,
MyClass<int> ins; // print 'int' to console
正如其他几个人提到的那样,您可以使用 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
感谢@MM 的评论 - 如果您使用的是 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
您可以为此使用重载函数
std::string MY_MACRO(int) { return "int"; }
用作std::cout << MY_MACRO( T() );
,但您需要为用作模板参数的每种类型定义此类函数。
或者您可以通过typeid
函数使用运行时类型识别。