String representation of the template argument type name in the compile time

konyuchenko.nikita
konyuchenko.nikita

Очень хочется получить что-нибдуь осмысленное в static_assert например.

template <typename T>
void method() {
  static_assert(false, std::type_name<T>::value " is not supported");
}

template <>
void method<SupportedType>() { impl; }
-2
рейтинг
5 комментариев
Andrey Davydov
Наличие трэйта std::type_name не поможет для вывода сообщения в static_assert, поскольку сообщение должно быть литералом полученным после препроцессирования, а не compile time константой: en.cppreference.com/w/cpp/language/static_assert#Note
Andrey Davydov
Andrey Davydov
Но если хочется имя типа именно в compile time, то прямо сейчас уже есть библиотека boost::typeindex (авторства yndx-antoshkka, как я понимаю), правда, имя будет мангленное.
Гипотетический std::type_name является маленькой частью static reflection proposal.
Andrey Davydov
konyuchenko.nikita
Andrey Davydov, Стандарт действительно явно указывает что message это string literal. Только вот не понятно, в связи с чем такое ограничение и почему бы его не расширить до любого constexpr выражения. static_assert это keyword, а не кусок stl и его обработка в любом случае внутри компилятора.
>> Гипотетический std::type_name является маленькой частью static reflection proposal.
Да. Также в большинстве случаев, когда нужна такая конструкция, можно обойтись концептами.
konyuchenko.nikita
yndx-antoshkka
Стоит подождать концептов и статической рефлексии, прежде чем внедрять данное предложение. Возможно что рефлексия и концепты всё поправят.
yndx-antoshkka
Sir-VestniK
На самом деле конструкция в примере пишется так

template<typename T>
void method() = delete;

template<>
void method<SupportedType>() {impl;}

если у кого-то это не работает, значит вы пользуетесь clang и наступаете на баги llvm.org/bugs/show_bug.cgi?id=17537 и llvm.org/bugs/show_bug.cgi?id=18539
Sir-VestniK
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).