2009-08-23 5 views
0

J'écris une implémentation de la facette std :: codecvt qui utilise iconv. L'implémentation This stocke un pointeur sur les données allouées par tas dans l'argument d'état std :: mbstate_t.Un pointeur peut-il être stocké dans le type std :: mbstate_t?

Tout fonctionne bien, mais ce code est-il compatible 64 bits? Existe-t-il une plate-forme où la taille d'un pointeur dépasse la taille de std :: mbstate_t?

+0

The Standard C++ est remarquablement réticents en ce qui concerne mbstate_t. Le type est en fait défini par la norme C. J'ai ré-étiqueté votre question en conséquence. –

Répondre

1

Le modèle codecvt ne prend-il pas en paramètre le type d'état? Pouvez-vous simplement utiliser un type de pointeur à la place? Je ne me souviens pas si les différentes classes qui utilisent un codecvt imposent des exigences sur le type d'état. En supposant que vous ne pouvez pas simplement changer le type d'état ... sur MSVC 2008, mbstate_t est typedef d int. La norme exige seulement que int soit plus grand que 16 bits et pas plus long qu'un long, donc ce n'est pas sûr de 64 bits. Je suppose que vous auriez besoin de stocker un index ou une clé dans une structure de données au lieu d'un pointeur.

update:

Les compilations suivantes sous VS2008, au moins:

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

Codecvt avec un type d'état différent de std :: mbstate_t est essentiellement inutile en termes d'implémations standart streambuf. L'utilisation d'un autre type d'état vous obligera à réimplémenter les ancêtres streambuf. – Basilevs

Questions connexes