【问题标题】:Translating const strings in structure initializers在结构初始化器中翻译 const 字符串
【发布时间】:2010-07-15 13:33:00
【问题描述】:

我正在处理一个在结构初始化程序中使用 const 字符串的大型代码库。我试图用最少的时间通过 GNU gettext 翻译这些字符串。 是否可以将某种转换运算符添加到 default_value 以允许案例 #1 工作?

#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
}

【问题讨论】:

  • 有没有理由不使用std::string 来存储字符串?
  • 我很想使用 std::string!不幸的是,这是遗留的 C 代码——有 200,000 行。结构字节也按原样通过网络传输,因此除非我们对整个系统进行重大重写,否则只允许 POD。不幸的是,现在这不是一个选项。
  • @bshields:删除 c++ 标签的任何特殊原因。示例中的代码显然是 C++。
  • 另外,示例中的代码显然不是 C。将 c 标签转换为 c++ 标签可能会得到更好的结果。
  • @Jens Gustedt 抱歉改回来了。

标签: c++ gettext


【解决方案1】:

直接转换成data1怎么样?

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

然后:

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

【讨论】:

  • 好主意!问题是我在结构中除了字符串之外还有其他成员。上面的代码只是一个测试用例。实际的结构通常有 100 多个成员:字符串、浮点数、双精度数、枚举值等。通过使用 fixed_string,我可以编写转换,但我还必须将所有数组更新为 fixed_string。我可以这样做,但我首先要寻找更好的选择。
  • 我选择了案例#3。静态大小的数组比我预期的要少,而且将它们更改为使用模板类的副作用也很少。
猜你喜欢
  • 2016-02-18
  • 1970-01-01
  • 2013-02-25
  • 1970-01-01
  • 2011-09-26
  • 2017-07-24
  • 2012-06-12
  • 1970-01-01
  • 2013-12-23
相关资源
最近更新 更多