代码之家  ›  专栏  ›  技术社区  ›  Dark Falcon

在结构初始值设定项中转换常量字符串

  •  0
  • Dark Falcon  · 技术社区  · 15 年前

    我正在使用一个大型代码库,它在结构初始化器中使用const字符串。我试图用最少的时间通过gnugetext翻译这些字符串。 是否有某种类型的转换运算符可以添加到默认的#值中,以允许Case#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
    }
    
    1 回复  |  直到 15 年前
        1
  •  2
  •   Tomek    15 年前

    ..
    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...
    ..