3

type の変数がありますBlah

char[sizeof(blah)]コピーせずにキャストしたい。
を期待するテンプレートをインスタンス化するのに十分強力な型キャストが必要ですchar[N]

いろいろやってみたのですが、なかなか取れません。
私はこのようなものが正しく動作することを望みます:

class Blah {
 int a;   
};


template <typename T>
void foo (T& a) 
{ 
    //Not an array
}

template <int N>
void foo (char(&a)[N]) 
{ 
    //an array!
}

Blah b;
foo(b); //not an array
foo((char[sizeofBlah])b); //hopefully treated as an array
4

3 に答える 3

10

そのようなキャストは実行できません。意味がありません。できることは、オブジェクトのアドレスを取得し、そのアドレスをバイト アドレスとして再解釈することです。

char* const buf = reinterpret_cast<char*>(&obj);

これで要件は満たされるはずですがchar[]、実際に行われている操作がわかりにくくなるため、「にキャストする」という用語の使用には注意してください。

もちろん、アドレスを固定サイズのバッファーの開始アドレスとして解釈することもできます。

using buffer_t = char[sizeof(Blah)];
buffer_t* pbuf = reinterpret_cast<buffer_t*>(&obj);

ただし、ここではまだバッファへのポインタを使用していることに注意してください。

于 2013-03-19T16:28:05.803 に答える
1

最もクリーンな方法は、それを操作としてクラスに追加することです。

class Blah {
    int a;
public:
    void serialize(char *output) { output[0] = a; /* add others as needed */ }
};

Blah blah;
char buffer[sizeof(Blah)];
blah.serialize(buffer);

これにより、何が起こっているかを明示的に確認し、後で変更する必要がある場合に備えてコードを集中化できます。

編集:私の例では、シリアル化インターフェイスはあまりエレガント (または非常に安全) ではありませんが、私のポイントは、メソッドとして追加する必要があるということです。

于 2013-03-19T16:37:41.577 に答える