私は、C++ で実装されたオープンソースの UNIX ツールを使用しています。コードを変更して、必要な機能を実行させる必要があります。私のパッチがアップストリームに受け入れられることを期待して、可能な限り小さな変更を加えたいと思います。標準 C++ で実装可能で、外部依存関係をさらに作成しないソリューションが優先されます。
これが私の問題です。私はC++クラスを持っています-それを「A」と呼びましょう-現在、fprintf()を使用して、その非常にフォーマットされたデータ構造をファイルポインターに出力します。その印刷関数では、複数のメンバー クラス ("B" は例) の同一に定義された印刷関数も再帰的に呼び出します。A のインスタンスの print() 結果に設定する必要があるメンバー std::string "foo" を持つ別のクラス C があります。これは、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[] を手動で割り当て、多くの c 文字列をマージし、最後に文字配列を std::string に変換する必要があります。
文字列ストリームで a.print() の結果をキャッチしてみてください
- すべてのフォーマット文字列を << 出力フォーマットに変換する必要があります。変換する何百もの fprintf() があります:-{
- UNIXファイルハンドルから出力ストリームを作成するための標準的な方法を私が知っているわけではないため、print()を書き直す必要があります(この人はそれが可能かもしれないと言いますが)。
Boost の文字列フォーマット ライブラリを使用する
- より多くの外部依存関係。うん。
- Format の構文は printf() とはかなり異なり、面倒です。
printf(format_str, args) -> cout << boost::format(format_str) % arg1 % arg2 % など
-
- 別の外部依存関係。
それで、考えられるすべてのオプションを使い果たしましたか?もしそうなら、どれが私の最善の策だと思いますか? そうでない場合、私は何を見落としましたか?
ありがとう。