C++11 static_assert: параметризованные сообщения об ошибках

В моем предыдущем вопросе я хотел использовать static_assert, чтобы ограничить параметр шаблона определенным подтипом. На вопрос был дан ответ, код для архивирования выглядит следующим образом:

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

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

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

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

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

8
задан Community 23 May 2017 в 12:17
поделиться