В 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(), но он возвращает только искаженное имя, которое неприемлемо. Я помню, что был какой-то макрос, который возвращает имя что-то, но я больше не могу это вспомнить.
Сопутствующий (peraps даже надуть): http://stackoverflow.com/q/6415186/34509 –