我有代碼:模板參數類型爲字符串
template<class T>
class MyClass{
MyClass(){
std::cout << MY_MACRO(T);
}
};
是否有可能寫出這樣的宏返回模板參數的類型爲字符串?如果是,如何?
例如,
MyClass<int> ins; // print 'int' to console
我有代碼:模板參數類型爲字符串
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
您可以使用gcc的'abi :: __ cxa_demangle'來取消名稱的縮寫。 – deepmax 2013-03-19 13:06:46
不錯 - 學到了新東西。我將它添加到我的答案中。 – 2013-03-19 13:24:57
你可以使用重載函數,像
std::string MY_MACRO(int) { return "int"; }
被用作
std::cout << MY_MACRO(T());
,但你需要定義這樣的功能每次使用AS型模板參數。
或者您可以通過typeid
函數使用運行時類型標識。
沒有標準的方式,我怕... – StoryTeller 2013-03-19 12:42:48
您可以使用RTTI,我猜(無關宏)。 – 2013-03-19 12:44:26