翻译结构初始值设定项中的 const 字符串

发布于 2024-09-10 11:36:16 字数 1096 浏览 1 评论 0原文

我正在使用一个大型代码库,它在结构初始值设定项中使用 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
}

I'm working with a large code base which uses const strings in structure initializers. I'm trying to translate these strings via GNU gettext with a minimal amount of time.
Is there some sort of conversion operator I can add to default_value which will allow Case #1 to work?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

寒冷纷飞旳雪 2024-09-17 11:36:16

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

What about direct conversion to data1?

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

and then:

..
    data1 d1 = default_value(translate("Hello")); // should work now...
..
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文