【发布时间】: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 抱歉改回来了。