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
}
Y at-il une raison pour laquelle vous n'utilisez pas 'std :: string' pour stocker vos chaînes? – ereOn
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. –
@bshields: toute raison particulière pour laquelle vous avez supprimé la balise C++. Le code présenté dans l'exemple est clairement C++. –