私はiconvを使用するstd :: codecvtファセットの実装を書いています。 This実装は、std :: mbstate_t状態引数にヒープ割り当てデータへのポインタを格納します。ポインタをstd :: mbstate_t型に格納することはできますか?
すべて正常に動作しますが、このコードは64ビット互換ですか? ポインタのサイズがstd :: mbstate_tのサイズを超えるプラットフォームがありますか?
私はiconvを使用するstd :: codecvtファセットの実装を書いています。 This実装は、std :: mbstate_t状態引数にヒープ割り当てデータへのポインタを格納します。ポインタをstd :: mbstate_t型に格納することはできますか?
すべて正常に動作しますが、このコードは64ビット互換ですか? ポインタのサイズがstd :: mbstate_tのサイズを超えるプラットフォームがありますか?
codecvt
テンプレートでは、状態タイプをパラメータとして使用しませんか?代わりに代わりにポインタ型を使用できますか?状態タイプに対して、codecvt
の所要量を使用するさまざまなクラスが必要かどうかを覚えていません。
MSVC 2008の状態タイプを変更することはできないと仮定すると、mbstate_t
はtypedef
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);
std :: mbstate_tと異なる状態タイプのcodecvtは、標準的なstreambuf実装に関しては本質的に役に立たない。別の状態タイプを使用すると、先祖のstreambufを再実装する必要があります。 – Basilevs
C++標準は著しく寡黙です。このタイプは実際にはC標準によって定義されています。私はそれに応じてあなたの質問に再度タグをつけました。 –