cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

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

Open sergii-rybin-tfs opened 1 year ago

sergii-rybin-tfs commented 1 year ago

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

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

Smertig commented 1 year ago

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

sergii-rybin-tfs commented 1 year ago

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

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

pavelkryukov commented 1 year ago

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

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