Внутри шаблонов вы получаете то, что Дэниел Фрей имеет объяснено. Вне шаблонов это невозможно только с помощью static_assert
, но это можно сделать с помощью макроса и оператора строкового преобразования #
:
#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.
person
Cassio Neri
schedule
03.01.2014