私はコードを持っています:
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
。