тип аргумента шаблона в строку

У меня есть код:

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

Можно ли написать такой макрос, который возвращает тип аргумента шаблона в виде строки? Если да, то как?

Например,

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

4

Решение

Как уже упоминалось парой людей, вы могли бы что-то сделать с 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

Спасибо за комментарий от @M M — если вы используете 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
2

Другие решения

Вы можете использовать перегруженные функции для этого, как

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

который используется как std::cout << MY_MACRO( T() );, но вам нужно определить такую ​​функцию для каждого типа, который вы используете в качестве параметра шаблона.

Или вы можете использовать идентификацию типа во время выполнения через typeid функция.

1

По вопросам рекламы [email protected]