2010-07-15 4 views
0

Je travaille avec une base de code importante qui utilise des chaînes const dans les initialiseurs de structure. J'essaye de traduire ces chaînes via GNU gettext avec un minimum de temps. Existe-t-il une sorte d'opérateur de conversion que je peux ajouter à default_value, ce qui permettra au cas n ° 1 de fonctionner?Traduction de chaînes const dans les initialiseurs de structure

#include <cstring> 

template<int N> struct fixed_string 
{ 
    char text[N]; 
}; 

// Case #1 
struct data1 
{ 
    char string[50]; 
}; 

// Case #2 
struct data2 
{ 
    const char* string; 
}; 

// Case #3 
struct data3 
{ 
    fixed_string<50> string; 
}; 

// A conversion helper 
struct default_value 
{ 
    const char* text; 
    default_value(const char* t): text(t) {} 

    operator const char*() const 
    { 
     return text; 
    } 

    template<int M> operator fixed_string<M>() const 
    { 
     fixed_string<M> ret; 
     std::strncpy(ret.text, text, M); 
     ret.text[M - 1] = 0; 
     return ret; 
    } 
}; 

// The translation function 
const char* translate(const char* text) {return "TheTranslation";} 

int main() 
{ 
    data1 d1 = {default_value(translate("Hello"))}; // Broken 
    data2 d2 = {default_value(translate("Hello"))}; // Works 
    data3 d3 = {default_value(translate("Hello"))}; // Works 
} 
+0

Y at-il une raison pour laquelle vous n'utilisez pas 'std :: string' pour stocker vos chaînes? – ereOn

+0

J'aimerais utiliser std :: string! Malheureusement, il s'agit d'un code C hérité - 200 000 lignes. Les octets de structure sont également transmis sur le réseau tel qu'il est, de sorte que seul le POD est autorisé à moins que nous ne procédions à une réécriture majeure du système entier. Malheureusement, ce n'est pas une option pour le moment. –

+0

@bshields: toute raison particulière pour laquelle vous avez supprimé la balise C++. Le code présenté dans l'exemple est clairement C++. –

Répondre

2

Qu'en est-il de la conversion directe en données1?

.. 
operator data1() const 
{ 
    data1 ret; 
    std::strncpy(ret.string, text, sizeof(ret.string)); 
    ret.string[sizeof(ret.string)] = 0; 
    return ret; 
} 
.. 

puis:

.. 
    data1 d1 = default_value(translate("Hello")); // should work now... 
.. 
+0

Bonne idée! Le problème est que j'ai d'autres membres dans la structure en dehors des cordes. Le code ci-dessus est juste un cas de test. Les structures actuelles ont souvent plus de 100 membres: chaînes, flottants, doubles, valeurs enum, etc. En utilisant fixed_string, je suis capable d'écrire une conversion, mais je dois aussi mettre à jour tous les tableaux à être fixed_string. Je peux le faire, mais je cherche d'abord une meilleure option. –

+0

J'ai opté pour le cas n ° 3. Il y avait moins de tableaux de taille statique que je ne l'avais prévu, et peu d'effets secondaires en les changeant pour utiliser la classe template à la place. –

Questions connexes