c ++消息查找表(iostream)

时间:2012-05-15 15:06:18

标签: c++ string formatting

在C ++中是否有一种简单的方法可以使用允许使用变量的消息查找表。

例如在C中你可以有这样的东西:

const char* transaction_messages[] = {
"UNAUTHORIZED",
"UNKNOWN_ORDER",
"UNKNOWN_DEALER",
"UNKNOWN_COMMODITY",
"INVALID_MESSAGE",
"BOUGHT %d %s @ %f.1 FROM %s", //amount, commodity, price, dealer
"SOLD %d %s @ %f.1 FROM %s", //amount, commodity, price, dealer
"%d HAS BEEN FILLED", //order id
"%d HAS BEEN REVOKED", //order id
"%d %s %s %s %d %f.1 HAS BEEN POSTED", //order id, dealer, side, commodity, amount, price
"%d %s %s %s %d %f.1" //order id, dealer, side, commodity, amount, price
};

然后在像这样的函数中使用它:

void myfunction(int amount, char* commodity, double price, char* dealer){

    char *msg = transaction_message[6];
    printf(msg, amount, commodity, price, dealer);
}

我希望能够对ostream做同样的事情,而不是对<<运算符在同一个东西看起来像:

ostream << "BOUGHT" << amount << " " << commodity << " @ " << price << " FROM " << dealer;

我现在能想到的唯一方法就是拥有一堆返回字符串的内联函数,而不是使用char *表而是有一个查找内联函数的函数表。必须有一个更简单的方法。

3 个答案:

答案 0 :(得分:1)

您正在做的与本地化(AKA L10N)非常相似。

有几个问题:Best way to design for localization of strings

但是有几个包已经解决了这个问题 这些基本上是为了从您的应用程序中获取所有字符串并将它们打包在一个单独的资源中(在运行时选择正确的资源(通常取决于区域设置))。但是他们通常使用“英语”(或者我应该说非英语程序员的原始文本)作为查找文本来查找正确的资源字符串(因此代码仍然可供开发人员阅读)并且用户获得特定语言字符串显示。

当然还有一个

但还有其他人(快速谷歌发现)

Othere资源:

但获得正确的字符串只是成功的一半。然后,您需要正确地将字符串中的占位符交换运行时值。就个人而言,这是我认为boost::format真正闪耀的地方。

示例:

sprintf("The time is %s in %s.", time, country);

麻烦的是名词和动词的顺序因语言而异。例如,如果我们翻译

  

“德国的时间是12:00。”

进入阿塞拜疆

  

“Saat Almaniya saat 12:00 deyil。”

您会注意到“德国”(Almaniya)这个词与时间交换位置。因此,以特定顺序替换项目的简单任务不起作用。您需要的是索引占位符。 (提升::格式救援)。

std::cout << boost::formt("The time is %1 in %2.") << time << country;
// Notice the place holders are number '%1' means the first bound argument
// But the format string allows you to place them in any order in the string
// So your localized resource will look like this:

std::cout << boost::formt("Saat %2 saat %1 deyil.") % time % country;

或更有可能:

std::cout << boost::formt(I10N.get("The time is %1 in %2.")) % time % country;

答案 1 :(得分:0)

在C ++中boost::format可以用作类型安全的sprintf()

答案 2 :(得分:0)

怎么样:

ostream& ToString(ostream&O, int amount, char* commodity, double price, char* dealer)
{
  char buf[80];

  char *msg = transaction_message[6];
  sprintf(msg, amount, commodity, price, dealer);

  return O << buf;
}