2009-08-23 8 views
0

私はiconvを使用するstd :: codecvtファセットの実装を書いています。 This実装は、std :: mbstate_t状態引数にヒープ割り当てデータへのポインタを格納します。ポインタをstd :: mbstate_t型に格納することはできますか?

すべて正常に動作しますが、このコードは64ビット互換ですか? ポインタのサイズがstd :: mbstate_tのサイズを超えるプラットフォームがありますか?

+0

C++標準は著しく寡黙です。このタイプは実際にはC標準によって定義されています。私はそれに応じてあなたの質問に再度タグをつけました。 –

答えて

1

codecvtテンプレートでは、状態タイプをパラメータとして使用しませんか?代わりに代わりにポインタ型を使用できますか?状態タイプに対して、codecvtの所要量を使用するさまざまなクラスが必要かどうかを覚えていません。

MSVC 2008の状態タイプを変更することはできないと仮定すると、mbstate_ttypedef d、intとなります。この規格では、intは16ビットより大きく、長さは長くないため、64ビットでは安全ではありません。ポインタの代わりにインデックスやキーをいくつかのデータ構造体に格納する必要があると思います。

更新:VS2008下

以下コンパイル、少なくとも:それがのmbstate_tに来るとき

std::wstring const in = L"input"; 
size_t const buf_size = 256; 
char* buf = new char[buf_size]; 
wchar_t const* char_next; 
char * byte_next; 
void* state = NULL; 

typedef std::codecvt<wchar_t, char, void*> codecvt_t; 
codecvt_t::result res = 
    std::use_facet<codecvt_t>(std::locale()).out(
     state, in.c_str(), in.c_str() + in.length(), 
     char_next, &buf[0], &buf[buf_size], byte_next); 
+0

std :: mbstate_tと異なる状態タイプのcodecvtは、標準的なstreambuf実装に関しては本質的に役に立たない。別の状態タイプを使用すると、先祖のstreambufを再実​​装する必要があります。 – Basilevs

関連する問題