0

在 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* 表,而是拥有一个查找内联函数的函数表。必须有一个更简单的方法。

4

3 回答 3

1

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

对此有几个问题:字符串本地化设计的最佳方式

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

当然boost也有一个

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

其他资源:

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

例子:

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

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

“德国时间是12:00。”

进入阿塞拜疆

“Saat Almaniya 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;
于 2012-05-15T15:30:04.303 回答
0

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

于 2012-05-15T15:16:34.460 回答
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;
}
于 2012-05-15T15:17:14.580 回答