0

在我第一次接触的语言中,有一个函数repeat(),它接受一个字符串,并重复它n多次。例如,repeat ("hi", 3)给出 的结果"hihihi"

我确实有很多次使用这个函数,但令我沮丧的是,我从未在 C++ 中找到类似的东西。是的,我可以很容易地自己制作,或者让它更易于使用,但我有点惊讶它还没有包含在内。

它非常适合的一个地方是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+,我们必须确保一个参数实际上是一个字符串。他们为什么不直接为它定义一个文字,比如""s?不以下划线开头的文字后缀是为实现保留的,所以这不应该冲突,因为在任何人真正开始制作自己的之前如何添加它。

回到重复的例子,语法就是:

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

这将产生:

123123123456

同时,也可以包括一个字符,以满足cout << '1's + '2's;

为什么不包括这两个功能?它们肯定有明确的含义,并且使编码更容易,同时仍然使用标准库。

4

2 回答 2

4

好吧,至于乘法,它并不真正符合 C++ 的哲学:像 Ruby 这样的语言“包含电池”并具有“最少意外原则”。它们旨在将许多这些小细节作为超越最低限度的功能。C++ 是一种系统级语言,旨在“更接近金属”,这非常清楚,因为 astring甚至不是该语言的核心数据类型,而是库提供的插件。甚至 FORTRAN 也具有原生字符串类型,因此您可以看到低级 C++ 的定位。这是故意的:如果您正在编写具有 1K 存储的嵌入式芯片并且不需要字符串怎么办?只是不要包括他们。

无论如何,乘法运算符应该做什么并不是 100% 清楚的。换句话说,在 C++ 的核心语言和库中,除非似乎几乎每个人都同意提议的功能,否则没有任何功能可以加入。它必须是非常普遍的。

我可能会认为“123”* 3 可以给出“369” - 将任何数字乘以 3。我进一步建议这种解释是“理智的”,足以防止您的重复运算符解释成为唯一明确的解释。

字面符号更容易和更清楚地回答:std::string是标准库的一部分,它是语言语法本身之上的一个抽象级别。换句话说,文字符号将突破分离“语言特性”和“您可以期望与编译器捆绑的库”的抽象级别。

于 2012-05-14T21:26:05.177 回答
1

std::string.append(numtimes, char to repeat); 那里。确实如此。现在,这适用于字符文字,因为对于字符串来说,没有办法以声明方式做到这一点。还要注意,std::string 类不是语言类型,c++ 中的字符串字面量是 const char *。一个指针。哪些数组衰减为指针,这就是 std::string 类处理它包含的内容的方式,即字符数组,即 char 或 std::wstring 的 wchar_t。有这些类型的模板。

于 2012-05-14T21:28:31.637 回答