Есть ли функция compc-time func/macro, чтобы определить, является ли С++ 0x-структурой POD?
Я хотел бы иметь С++ 0x static_assert, который проверяет, является ли данный тип структуры POD (чтобы другие программисты случайно не нарушили его с новыми членами). то есть,
struct A // is a POD type
{
int x,y,z;
}
struct B // is not a POD type (has a nondefault ctor)
{
int x,y,z;
B( int _x, int _y, int _z ) : x(_x), y(_y), z(_z) {}
}
void CompileTimeAsserts()
{
static_assert( is_pod_type( A ) , "This assert should not fire." );
static_assert( is_pod_type( B ) , "This assert will fire and scold whoever added a ctor to the POD type." );
}
Есть ли какой-то макрос или int is_pod_type()
, который я могу использовать здесь? Я не мог найти его в каких-либо документах С++ 0x, но, конечно, информация о сети на 0x все еще довольно фрагментарная.
Ответы
Ответ 1
С++ 0x вводит библиотеку признаков типов в заголовке <type_traits>
для такого рода интроспекции, и существует черта типа is_pod
. Я считаю, что вы использовали бы его в сочетании с static_assert
следующим образом:
static_assert(std::is_pod<A>::value, "A must be a POD type.");
Я использую для этого проект ИСО N3092, поэтому есть шанс, что это устарело. Я рассмотрю это в последнем черновике, чтобы подтвердить это.
EDIT. Согласно самому последнему проекту (N3242), это все еще актуально. Похоже, это способ сделать это!