2012-06-15 3 views
8

В my previous question Я хотел использовать static_assert, чтобы ограничить параметр шаблона конкретным подтипом. Этот вопрос был получен ответ, код archieving, который выглядит следующим образом:C++ 11 static_assert: Параметрированные сообщения об ошибках

template <typename T> 
struct X { 
    static_assert(std::is_base_of<Y,T>::value,"T must be derived from Y!"); 
}; 

Теперь я хочу, чтобы сообщение об ошибке более кратким. I.e., я хочу указать, какой тип нарушает это ограничение. Например, если класс A не получен из Y, а кто-то инициирует X<A>, тогда сообщение об ошибке должно печатать «Параметр типа должен быть получен из Y, но A не является».

Это как-то достижимо со стандартной библиотекой?

Я вижу две проблемы:

  • Сборка струны на compiletime без наддува :: MPL
  • получения имени типа, с которым T был инстанциирован. Имя должно быть значимым, в идеале таким же, как и в нарушающем определении. Я попробовал typeid (T) .name(), но он возвращает только искаженное имя, которое неприемлемо. Я помню, что был какой-то макрос, который возвращает имя что-то, но я больше не могу это вспомнить.
+1

Сопутствующий (peraps даже надуть): http://stackoverflow.com/q/6415186/34509 –

ответ

7

Вы не можете сделать этого. static_assert хочет строковый литерал. У вас нет возможности собрать семантический идентификатор T и Y в строковый литерал.

Вы можете надеяться, что компилятор даст возможность легко считывать обратную трассировку стека создания экземпляра шаблона и дает значение параметров шаблона вмещающего класса T и Y.

Другие люди подумали об этом, см., Например, http://comments.gmane.org/gmane.comp.compilers.clang.devel/5073.

+0

Как всегда для диагностики, это QOI. –

+0

какой позор. Почему литерал, строка константы времени компиляции была бы лучше :(. – gexicide

+0

@gexicide. Как правило, практически невозможно создавать постоянные строки времени компиляции. (Кроме того, литералы, конечно.) Распечатка значений последовательности произвольных компиляций, постоянные значения времени и/или идентификаторы типов были бы хороши. – Potatoswatter