私は現在、C++ メモリ編集ライブラリを作成しており、読み取り/書き込み API には型特性 (std::is_pod、std::is_same) と boost::enable_if を使用して 3 つのオーバーロードを提供しています。
- ポッドの種類。例 MyMem.Read(SomeAddress);
- 文字列型。例 MyMem.Read>(SomeAddress); (これは実際には C++ 文字列を読み取るのではなく、C スタイルの文字列を読み取り、それを C++ 文字列に変換します。)
- ベクトル型。例 MyMem.Read>(SomeAddress, NumElem); (これは実際にベクトルを読み取るのではなく、C スタイルの配列を読み取ってベクトルに変換します。)
オーバーロード 2 と 3 は、オーバーロード 1 の単純な「ラッパー」です。
最近、コンパイル時に読み書きしたいデータのサイズを知っていたので、一連の読み取りと書き込みに std::array を使用したいと思いました (私は PE ファイル形式のラッパーを書いていました)。
std::array を使用するコードを作成し、std::array 型の検出と処理のために別のオーバーロードを追加するつもりでしたが、誤ってコンパイルを実行してしまい、驚いたことにそれが機能しました!
私は現在 MSVC 10 を使用していますが、std::array の場合、T が POD の場合、std::array は POD であることがわかります。(つまり、オーバーロード 1 を使用するだけで機能します。)
私の質問は、これが C++ 標準によって保証されているのか、それとも実装に任されているのかということです。
自分で標準を確認できることはわかっていますが、このサイトの言語弁護士の一部を信頼するほど自分自身を信頼していないため、「セカンドオピニオン」を取得するのが最善であると考えました. ;)
ありがとう
PS コードはこちらから入手できます (ヘッダーのみのライブラリです): http://code.google.com/p/hadesmem/source/browse/trunk/HadesMem-v2/Hades-Memory/Hades-Memory/MemoryMgr.h#86