2013-03-19 93 views
4

我有代码:模板参数类型为字符串

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

是否有可能写出这样的宏返回模板参数的类型为字符串?如果是,如何?

例如,

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

没有标准的方式,我怕... – StoryTeller 2013-03-19 12:42:48

+0

您可以使用RTTI,我猜(无关宏)。 – 2013-03-19 12:44:26

回答

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 

感谢来自@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 
+1

您可以使用gcc的'abi :: __ cxa_demangle'来取消名称的缩写。 – deepmax 2013-03-19 13:06:46

+0

不错 - 学到了新东西。我将它添加到我的答案中。 – 2013-03-19 13:24:57

1

你可以使用重载函数,像

std::string MY_MACRO(int) { return "int"; } 
被用作 std::cout << MY_MACRO(T());

,但你需要定义这样的功能每次使用AS型模板参数。

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