Внутри шаблонов, вы получите то, что Daniel Frey «s имеет explained. Внешние шаблоны, это не представляется возможным с только static_assert
, но может быть достигнуто с помощью макроса и оператора stringification #
:
#define VERIFY_POD(T) \
static_assert(std::is_pod<T>::value, #T " must be a pod-type");
Для типа struct non_pod { virtual ~non_pod() {} };
с GCC 4.8.1, VERIFY_POD(non_pod)
дает
main.cpp:4:2: error: static assertion failed: non_pod must be a pod-type
static_assert(std::is_pod<T>::value, #T " must be a pod-type");
^
main.cpp:15:2: note: in expansion of macro 'VERIFY_POD'
VERIFY_POD(non_pod);
Если вы похожи на меня и не хотите, чтобы увидеть маркеры #T " must be a pod-type"
в сообщении об ошибке, то вы можете добавить дополнительную строку к макроопределению:
#define VERIFY_POD(T) \
static_assert(std::is_pod<T>::value, \
#T "must be a pod-type");
с этим, предыдущий пример дает:
main.cpp: In function 'int main()':
main.cpp:4:2: error: static assertion failed: non_pod must be a pod-type
static_assert(std::is_pod<T>::value, \
^
main.cpp:14:2: note: in expansion of macro 'VERIFY_POD'
VERIFY_POD(non_pod);
^
Конечно, точный вид сообщения об ошибке зависит от компилятора. С clang 3.4 мы получаем
main.cpp:14:5: error: static_assert failed "non_pod must be a pod-type"
VERIFY_POD(non_pod);
^~~~~~~~~~~~~~~~~~~
main.cpp:3:23: note: expanded from macro 'VERIFY_POD'
#define VERIFY_POD(T) \
^
1 error generated.
Составление строки во время компиляции - вы можете сделать это с помощью некоторых грязных макросов или магии шаблонов. [См. Здесь] (http://stackoverflow.com/q/6002594/183120) для чего-то подобного. – legends2k