6

パックされた POD 構造/クラスを取り、それをメモリ ブロックにコピーするコードがあります。

struct A
{
   int a;
   int b;
} a;

memcpy(mymemoryblock, (void *)&a, sizeof(A));

// later I get a reply and...

memcpy((void *)&a, mymemoryblock, sizeof(A));

これは POD タイプのデータに対してのみ有効であり、POD 性をテストできる方法があるかどうか知りたいことです。誰かが誤ってこのクラスにメンバー関数を追加した場合、memcpy 操作は無効になりますが、コンパイルは可能です。これにより、バグの検出が非常に困難になります。

is_POD_type(A) 関数、または実行時またはコンパイル時に PODness を検出するために使用できるその他のトリックはありますか?

4

3 に答える 3

14

std::is_pod<A>::valueC++11 で。

[編集: 上記の Luc のコメントを参照してください。C++11 では、実行している型を POD にする必要はありません。

さらに言えば、 にキャストする必要もありません。不必要にvoid*C スタイルのポインタを にキャストするvoid*のは少し危険です。いつの日かconst誤ってキャストしてしまうからです!]

C++03 にはそれを行う標準的な方法はありませんが、Boost には独自のis_pod方法があり、非標準的な方法を提供していないコンパイラでは注意が必要です。したがって、POD の特殊なケースが最適化であるコードを作成している場合に役立ちます (どこでも最適化が得られるわけではありません)。また、Boost が正確な答えを得ることができるコンパイラのみを気にする場合にも役立ちます。is_pod偽陰性によってコードが嫌悪感を抱いて諦めてしまうのは良くありません。

于 2012-09-02T01:31:41.643 に答える
4

標準 (C++98) では、C のような構築/破壊セマンティクスを持つ型のみが共用体のメンバーになることができると述べています。これは、型を非 POD にするほとんどのことをカバーするため、型 A のメンバーで共用体型を定義するだけで、コンパイラは A が POD でない場合に文句を言うはずです。

于 2012-09-02T02:02:12.763 に答える
0

std::tr1::is_pod を呼び出すメソッドが存在します

また、次のような自転車を使用できます。

#define CHECK_TYPE_IS_A_POD(TYPE)\
{\
  switch(1)\
  {\
    case 1:\
        TYPE IF_COMPILE_ERROR_THEN__##TYPE##__IS_NOT_A_POD;\
        /* prune out any warnings about not usage */ \
        IF_COMPILE_ERROR_THEN__##TYPE##__IS_NOT_A_POD = TYPE();\
    case 2:\
        ;\
  }\

ただし、名前空間修飾名と特殊なテンプレート タイプでは機能しません。

于 2013-06-17T07:01:27.653 に答える