c++ - 在结构初始值设定项中翻译 const 字符串

标签 c++ gettext

我正在处理一个在结构初始值设定项中使用 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
}

最佳答案

直接转换为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...
..

关于c++ - 在结构初始值设定项中翻译 const 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3255962/

相关文章:

c++ - 我可以从 C++ 访问包含 QtObject 的 QQmlContext 吗?

c# - 在各种技术之间传递数据

delphi - 如何在.pot文件中排除DBGrid.Column.FieldName

javascript - angularjs-gettext : translate text in placeholder

c++ - 如何在库加载时将预处理器定义传递给 DLL

c++ - SFINAE 组装?

c++ - 将 Boost Spirit Lex 语义操作转换为 Phoenix - 如何访问 _val?

python - 国际化 Django(在 OSX 上)

localization - gettext 的替代方案?

java - 代码看不到 JTextField 的值,尽管它显示在界面中