- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 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* 表,而是有一个查找内联函数的函数表。一定有更简单的方法。
最佳答案
您所做的与本地化 (AKA L10N) 非常相似。
有几个问题:Best way to design for localization of strings
但是有几个软件包已经处理了这个问题。
这些基本上旨在从您的应用程序中获取所有字符串并将它们打包在一个单独的资源中(在运行时选择正确的资源(通常取决于语言环境))。但是他们通常使用“英语”(或者我应该说非英语程序员的原始文本)作为查找文本以找到正确的资源字符串(因此代码仍然对开发人员可读)并且用户获得特定语言显示的字符串。
当然boost也有
但还有其他的(谷歌快速发现)
其他资源:
但是获得正确的字符串只是成功的一半。然后您需要正确地交换运行时值与字符串中的占位符。就个人而言,这是我认为的地方 boost::format真的很闪耀。
例子:
sprintf("The time is %s in %s.", time, country);
问题是名词和动词的顺序因语言而异。例如,如果我们翻译
"The time is 12:00 in Germany."
阿塞拜疆语
"Saat Almaniya saat 12:00 deyil."
您会注意到“德国”(Almaniya) 一词与时间互换了位置。因此,以特定顺序替换项目的简单任务是行不通的。您需要的是索引占位符。 (boost::format 来拯救)。
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;
关于C++消息查找表(iostream),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10603635/
在 C++ 中包含头文件时,和...有什么区别 在 <> 标志中包含 .h 部分与不包括 .h 部分? #include 与 #include 将标题名称用双引号括起来还是用 符号括起来? #inc
最近我在阅读 Accelerated C++ 并从练习答案中发现了这个有趣的代码。这是完整的代码, #include "stdafx.h" #include "4_4.h" #include usi
我正在开发一个需要能够在标准 C++ 编译器和准标准编译器上编译的实用程序。代码可以而且将会被扔到几乎任何现有的 C++ 编译器上。 我正在寻找一种可靠且可移植地确定目标编译器是否支持带或不带 .h
如果有一个文件 foo.cpp,那么它通常有一个关联的头文件 foo.h,其中包含 foo.cpp 中定义的函数的所有声明。这样,所有其他使用 foo.cpp 中的函数的文件都可以只包含 foo.h
iostream 和 iostream.h 有什么区别? 最佳答案 iostream.h 已被提供它的编译器弃用,iostream 是 C++ 标准的一部分。 为了明确说明,当前 C++ 标准 (IN
我知道关于 之间的区别的问题和 之前有人问过。阅读这些答案后,我发现了以下差异 当然iostream.h已弃用,新的符合标准的编译器不支持它 iostream.h不包含 std 中的所有内容命名
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Difference between iostream and iostream.h 我的教授说了以下内容:
我需要构建一些我在办公室电脑上得到的旧代码,它有 gcc 4.4.5安装。我编辑了代码(删除 .h 或添加类似 的内容)以使它们保持最新,以便它们可以由 gcc 4.4.5 编译.但是,在看似成功编
我在学习C++的时候遇到了一个问题,在编译的时候遇到了错误。 详情如下: 最佳答案 您似乎没有在 MinGW 中安装 C++ 支持。如果您使用手动安装路径,请下载 gcc-c++ dev、dll 和
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: What is the difference between #include and #include
对于我当前的任务,我需要能够读/写(主要是基于文件的)比特流。虽然如果用标准 C/C++ 编码,这或多或少是一项微不足道的任务,但我喜欢通过重载和使用更通用的方法重写代码标准的 STL iostrea
这个问题在这里已经有了答案: Difference between iostream and iostream.h (3 个答案) 关闭 9 年前。 有什么区别 #include 和 #inclu
我正在尝试为 linux/MacOS 转换一个用 C++14 编写的应用程序。它使用 boost::filesystem,但不用于某些 iostream 操作。例如: boost::filesyste
示例: namespace boostio = boost::iostreams; boostio::stream memStream(arr); while (!memStream.eof())
我编写了以下简单的 C++ 程序: #include using namespace std; int main() { cout ^~~~~~~~~~ 1 error
我想在我的代码中将流公开为它们的标准等价物,以消除用户对 boost::iostreams 的依赖性.如果有必要,当然想有效地执行此操作而无需创建拷贝。我考虑过只设置 std::istream的缓冲区
#include in header files and #include only in cpp files 被认为是最佳实践。我正在尝试将大量 #include 从 header 移动到现有
#include #include #include #include using namespace std; int main() { int ival; while(ci
假设我得到一个 stringbuf,其中包含一些必须删除的特定字符序列的内容: std::stringbuf string_buff; std::iostream io_stream (&string
我有一个包含如下记录的文件 123 Tag 现在是所有好人都来帮忙的时候了 总是有一个数字和一些标签,后面跟着一系列单词。我想将数字提取为整数,将标记提取为字符串,将句子提取为字符串。我已经使用 ge
我是一名优秀的程序员,十分优秀!