3

ファイルとストリーム用の社内フレームワークがあるとしましょう。とIOutputStreamのインターフェイスクラスがwrite(char const *buffer, size_t size)ありflush()ます。私は、子孫Printerの任意のインスタンスで使用できると呼ばれるツールを持っています。IOutputStream次にPrinter & operator<<(T x)、スタイルメソッドがあります。ここT xで、は書き込まれるデータ(またはその参照またはポインター)です。

たとえば、文字列にPrinter & operator<<(int x)変換xされ、参照された出力ストリームのwrite(...)関数を実際に呼び出します。

問題を見てみましょう!呼び出し:printer << "appletree";。と呼びますPrinter & operator<<(char const *s)。この種の使用法ではstrlen(s)、サイズを決定するためにを呼び出す必要があり、その後、最終ステップを呼び出すことができます。appletreeコンパイル時の長さを知っているので、これはかなり正気ではありません。

これについて何か良い習慣はありますか?STLostreamはタイタルとどのように関係していますか?

4

2 に答える 2

6

文字列リテラルには typeconst char(&)[]があるため、それらのオーバーロードを追加できます。

template<size_t n>
Printer& operator<<(const char (&cstring)[n]) {
    write(cstring, n - 1);
}
于 2012-09-07T12:25:30.293 に答える
3

どうですか

template<std::size_t Size>
Printer& operator << (const char (&s)[Size]);
于 2012-09-07T12:25:28.780 に答える