4

私はコードを持っています:

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

テンプレート引数のタイプを文字列として返すようなマクロを書くことは可能ですか?はいの場合、どのように?

例えば、

MyClass<int> ins; // print 'int' to console
4

2 に答える 2

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
于 2013-03-19T12:58:19.987 に答える
1

あなたはそのようなためにオーバーロードされた関数を使うことができます

std::string MY_MACRO(int) { return "int"; }

これはとして使用されstd::cout << MY_MACRO( T() );ますが、テンプレートパラメータとして使用するすべてのタイプに対してそのような関数を定義する必要があります。

または、関数を介して実行時型識別を使用することもできますtypeid

于 2013-03-19T12:46:54.583 に答える