В настоящее время я ищу способ встраивания имени класса в реальные объекты.Получение имени не должно ничего стоить во время выполнения.Используя следующий код, я не получаю никаких дополнительных затрат в gcc (поскольку функция оценивается во время компиляции), но по какой-то причине clang не оценивает код во время компиляции
Я пытался использовать разные версии компилятора, но какПоскольку я тестировал все версии gcc и все версии clang, они давали одинаковые результаты (я действительно не смог протестировать MSVC, так как не смог найти необходимые флаги, чтобы он не производил 6K строк сборки)
#include <string>
#include <string_view>
#include <iostream>
template<class T>
constexpr std::string_view get_name()
{
char const* p = __PRETTY_FUNCTION__;
while (*p++ != '=');
for (; *p == ' '; ++p);
char const* p2 = p;
int count = 1;
for (;;++p2)
{
switch (*p2)
{
case '[':
++count;
break;
case ']':
--count;
if (!count)
return {p, std::size_t(p2 - p)};
}
}
return {};
}
int main(){
std::string_view s = get_name<std::string>();
std::cout << s << std::endl;
}
Версия Clang: https://godbolt.org/z/_vY8TD
Версия GCC: https://godbolt.org/z/hhXXWi
Я ожидаю, что clang даст аналогичный результат для gcc, но это не так