Open sergii-rybin-tfs opened 1 year ago
В static_assert
имя типа ничем не поможет, ибо он принимает вторым аргументом строго литерал.
В
static_assert
имя типа ничем не поможет, ибо он принимает вторым аргументом строго литерал.
Хорошее замечание, тогда если nameof будет возвращать строковой литерал, то компилятор сумеет склеить их.
Для типов стандартной библиотеки вывод, увы, не всегда выводится в формате (а) полезном и (б) консистентном. Пункт (б) весьма нехорош для стандартизации.
#include <https://raw.githubusercontent.com/Neargye/nameof/master/include/nameof.hpp>
#include <iostream>
int main()
{
std::cout << NAMEOF_TYPE_EXPR(std::string());
return 0;
}
вывод с Godbolt:
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > // GCC
class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > // MSVC
std::basic_string<char> // LLVM, libstdc++
std::string // LLVM, libc++
Часто не хватает простого способа получить имя типа в шаблоне. ( например в диагностике static_assert ) Почему бы не добавить nameof который работал бы аналогично size_of, но возвращал бы string_view/char* на имя типа.
Полезные ссылки: