以前の雇用主では、他のコンピューターに「回線を介して」送信する必要のあるバイナリ メッセージを作成していました。各メッセージには、次のような標準ヘッダーがありました。
class Header
{
int type;
int payloadLength;
};
すべてのデータは連続していました (ヘッダーの直後にデータが続きます)。ヘッダーへのポインターがあることを前提として、ペイロードに到達したいと考えました。伝統的に、あなたは次のように言うかもしれません:
char* Header::GetPayload()
{
return ((char*) &payloadLength) + sizeof(payloadLength);
}
あるいは:
char* Header::GetPayload()
{
return ((char*) this) + sizeof(Header);
}
それはちょっと冗長に思えたので、私は次のように思いつきました:
char* Header::GetPayload()
{
return (char*) &this[1];
}
最初は戸惑うかもしれませんが、使用するには奇妙すぎるかもしれませんが、非常にコンパクトです。それが素晴らしいか忌まわしいかについて多くの議論がありました。
コーディングに対する犯罪か、それとも素晴らしい解決策か? 同様のトレードオフを経験したことがありますか?
-アップデート:
サイズがゼロの配列を試してみましたが、その時点でコンパイラが警告を出しました。最終的には、継承された手法に行き着きました。メッセージはヘッダーから派生します。実際にはうまく機能しますが、原則として、メッセージ IsA Header を言っているので、少しぎこちないようです。