【发布时间】:2008-09-16 06:12:48
【问题描述】:
我正在使用一个用 C++ 实现的开源 UNIX 工具,我需要更改一些代码来让它做我想做的事情。我想做最小的改变,希望我的补丁在上游被接受。可在标准 C++ 中实现且不会创建更多外部依赖项的解决方案是首选。
这是我的问题。我有一个 C++ 类——我们称之为“A”——它目前使用 fprintf() 将其高度格式化的数据结构打印到文件指针。在它的打印函数中,它还递归地调用了几个成员类的相同定义的打印函数(“B”就是一个例子)。还有另一个类 C 有一个成员 std::string "foo",需要将其设置为 A 实例的 print() 结果。将其视为 A 的 to_str() 成员函数。
在伪代码中:
class A {
public:
...
void print(FILE* f);
B b;
...
};
...
void A::print(FILE *f)
{
std::string s = "stuff";
fprintf(f, "some %s", s);
b.print(f);
}
class C {
...
std::string foo;
bool set_foo(std::str);
...
}
...
A a = new A();
C c = new C();
...
// wish i knew how to write A's to_str()
c.set_foo(a.to_str());
我应该提到 C 相当稳定,但 A 和 B(以及 A 的其他依赖项)处于不断变化的状态,因此所需的代码更改越少越好。当前的 print(FILE* F) 接口也需要保留。我考虑了几种实现 A::to_str() 的方法,每种方法都有优点和缺点:
-
将对 fprintf() 的调用更改为 sprintf()
- 我不必重写任何格式字符串
- print() 可以重新实现为:fprint(f, this.to_str());
- 但我需要手动分配char[]s,合并很多c字符串,最后将字符数组转换为std::string
-
尝试在字符串流中捕获 a.print() 的结果
- 我必须将所有格式字符串转换为
- print() 必须重写,因为据我所知没有标准方法可以从 UNIX 文件句柄创建输出流(尽管 this guy says it may be possible)。
-
使用Boost的字符串format library
- 更多的外部依赖。糟糕。
- Format 的语法与 printf() 的语法大相径庭,令人讨厌:
printf(format_str, args) -> cout
-
使用Qt的QString::asprintf()
- 不同的外部依赖项。
那么,我是否已经用尽了所有可能的选择?如果是这样,你认为哪个是我最好的选择?如果没有,我忽略了什么?
谢谢。
【问题讨论】:
-
虽然我已经回答了这个问题,但我也想指出这个项目:github.com/c42f/tinyformat,它很好地解决了这个问题,并且在再现 printf 格式符号方面确实做得很好。这些天来,我直接使用该软件包,而不是几年前我在其他答案中详述的 vsprintf 方法。
标签: c++ unix format printf stdstring