Существует ли функция / макрос во время компиляции, чтобы определить, является ли структура C ++ 0x POD? - PullRequest
22 голосов
/ 24 августа 2011

Я хотел бы иметь C ++ 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." );
}

Есть ли какой-то макрос is_pod_type() или встроенный, который я могу использовать здесь? Я не смог найти его ни в одной документации C ++ 0x, но, конечно, информация в Интернете о 0x все еще довольно фрагментарна.

1 Ответ

26 голосов
/ 24 августа 2011

C ++ 0x вводит библиотеку признаков типа в заголовке <type_traits> для такого рода самоанализа, и существует признак типа is_pod. Я полагаю, что вы будете использовать его вместе с static_assert следующим образом:

static_assert(std::is_pod<A>::value, "A must be a POD type.");

Для этого я использую черновик ISO N3092, поэтому есть вероятность, что он устарел. Я пойду посмотрю это в самом последнем черновике, чтобы подтвердить это.

РЕДАКТИРОВАТЬ : В соответствии с самым последним проектом ( N3242 ) это все еще действует. Похоже, это способ сделать это!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...