我正在使用一个在结构初始化器中使用const字符串的大型代码库。我试图用最少的时间通过GNU gettext翻译这些字符串。 是否有某种转换运算符我可以添加到default_value,这将允许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
}
答案 0 :(得分:2)
如何直接转换为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...
..