2013-03-19 114 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函數使用運行時類型標識。

相關問題