ideas icon indicating copy to clipboard operation
ideas copied to clipboard

Получение имени типа

Open sergii-rybin-tfs opened this issue 2 years ago • 3 comments

Часто не хватает простого способа получить имя типа в шаблоне. ( например в диагностике static_assert ) Почему бы не добавить nameof который работал бы аналогично size_of, но возвращал бы string_view/char* на имя типа.

Полезные ссылки:

  • (https://github.com/Neargye/nameof)

sergii-rybin-tfs avatar Aug 29 '22 15:08 sergii-rybin-tfs

В static_assert имя типа ничем не поможет, ибо он принимает вторым аргументом строго литерал.

Smertig avatar Aug 29 '22 16:08 Smertig

В static_assert имя типа ничем не поможет, ибо он принимает вторым аргументом строго литерал.

Хорошее замечание, тогда если nameof будет возвращать строковой литерал, то компилятор сумеет склеить их.

sergii-rybin-tfs avatar Aug 29 '22 16:08 sergii-rybin-tfs

Для типов стандартной библиотеки вывод, увы, не всегда выводится в формате (а) полезном и (б) консистентном. Пункт (б) весьма нехорош для стандартизации.

#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++

pavelkryukov avatar Aug 31 '22 20:08 pavelkryukov