0

私が最初に紹介された言語にはrepeat()、文字列を取り、それを何n度も繰り返す関数 がありました。たとえば、repeat ("hi", 3)の結果が得られ"hihihi"ます。

私はこの関数をかなりの回数使用しましたが、残念なことに、C++ で同様のものを見つけたことがありません。はい、簡単に独自のものを作成したり、使いやすくしたりできますが、まだ含まれていないことにちょっと驚いています。

それが本当にうまく収まる場所の1つは次のstd::stringとおりです。

std::string operator* (const std::string &text, int repeatCount);
std::string operator* (int repeatCount, const std::string &text);

これにより、次のような構文が可能になります。

cout << "Repeating \"Hi\" three times gives us \"" << std::string("Hi") * 3 << "\"."

それ自体はまだそれほど素晴らしいものではありませんが、もっと良くなる可能性があります。

などの文字列演算子を使用するときはいつでも、operator+1 つの引数が実際に文字列であることを確認する必要があります。のようなリテラルを定義しなかったのはなぜ""sですか? アンダースコアで始まらないリテラル サフィックスは実装用に予約されているため、誰かが実際に独自のサフィックスを作成し始める前に追加された可能性があるため、競合することはありません。

繰り返しの例に戻ると、構文は次のようになります。

cout << "123"s * 3 + "456"s;

これにより、次が生成されます。

123123123456

その際、キャラクター用のものも含めることができます。cout << '1's + '2's;

これら 2 つの機能が含まれていないのはなぜですか? それらには明確な意味があり、標準ライブラリを使用しながらコーディングを容易にします。

4

2 に答える 2

4

乗算に関しては、実際には C++ の哲学ではありません。Ruby のような言語には、「バッテリーが含まれており」、「最小の驚きの原則」があります。これらは、最小限以上の機能として、これらの小さな機能を多数備えていることを目的としています。C++ は、「より金属に近い」ことを目的としたシステム レベル言語でありstring、言語のコア データ型でさえなく、ライブラリ提供のアドオンであるという点で非常に明確です。FORTRANでも文字列型がネイティブなので、低レベルC++の位置づけがわかります。これは意図的なものです。1K のストレージを備えた組み込みチップをプログラミングしていて、文字列を使用しない場合はどうなるでしょうか。それらを含めないでください。

とにかく、乗算演算子が何をすべきかは 100% 明確ではありません。言い換えれば、C++ のコア言語とライブラリでは、ほとんどのが提案された機能に同意しない限り、どの機能も導入されません。それは本当に普遍的でなければなりません。

私は、「123」* 3 が「369」を与える可能性があると考えるかもしれません-任意の数字を 3 で乗算します。さらに、この解釈は、繰り返し演算子の解釈が唯一の明確な解釈にならないようにするのに十分「正気」であると提案します。

リテラル表記の方がはるかに簡単で、より明確に答えることができます。std::stringこれは標準ライブラリの一部であり、言語構文自体よりも 1 レベル上の抽象化レベルです。言い換えれば、リテラル表記は、「言語機能」と「コンパイラにバンドルされると期待できるライブラリ」を分離する抽象化のレベルを突破します。

于 2012-05-14T21:26:05.177 に答える
1

std::string.append(numtimes, 繰り返す文字); そこには。します。これは文字リテラルで機能しますが、文字列でそれを行う場合、宣言的に行う方法はありません。また、std::string クラスは言語型ではなく、c++ の文字列リテラルは const char * です。ポインター。どの配列がポインタに分解され、それが std::string クラスが含まれるもの、文字の配列、つまり char、または std::wstring の wchar_t を処理する方法です。それらの型にテンプレート化されています。

于 2012-05-14T21:28:31.637 に答える