2

、、、の3つの構造headerdataAありdataBます。はheader、使用される構造を決定します。dataAとはほぼ同じ構造を持っています(dataBたとえば):

struct dataA
{
    int   intValue;
    char  reserved1[8];
    float floatValue;
    char  reserved2[4];
    short shortValue;
};

struct dataA
{
    int   intValue;
    short shortValue;
    char  reserved[2];
    float floatValue;
};

次のように印刷したい:

sprintf(outStr, "%i, %f, %s", p->intValue, p->floatValue, p->shortValue);

- また -

sprintf(outStr, "%i, %f, %s", p.intValue, p.floatValue, p.shortValue);

どうすれば宣言できpますか?(注:両方とも大きな構造dataAを持っていますが、予約dataB値であるものを除いて、ほとんど同じデータです。)

私はこのようなことを考えています:

void * p;

if (header->type==1)
   p = (dataA*)(pData);
else if (header->type==2)
   p = (dataB*)(pData);

// print all data here

注:ここpDataに、私が読み取る(生の)データへのポインターがあります。これらの予約されていない値のみが必要であり、予約された値は無視します。

4

1 に答える 1

7

印刷ロジックを関数テンプレートに移動します。

template <typename T>
int print_data(char* const str, std::size_t const len, T const* const p)
{
    return std::snprintf(
        str, len,
        "%i, %f, %s",
        p->intValue, p->floatValue, p->shortValue);
}

次に、スイッチングロジックからこの関数を呼び出します。

if (header->type==1)
    print_data(str, len, static_cast<dataA const*>(pData));
else if (header->type==2)
    print_data(str, len, static_cast<dataB const*>(pData));

の使用を計画している場合は、関数テンプレートにsをstd::snprintf追加して、のデータメンバーの型が期待する型であることを確認することをお勧めします。static_assertprint_dataT

プラットフォームに厳密なアライメント要件があり、が指すデータpDataがすべてのターゲットタイプに対して正しくアライメントされることが保証されていない場合は、キャストをバイトのコピーに置き換えて、適切にアライメントされたバッファに入れる必要があります。

于 2012-07-05T03:58:38.423 に答える