在我第一次介绍的语言中,有一个函数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;
为什么不包括这两个功能?它们肯定具有明确的含义,使编码更容易,同时仍然使用标准库。
答案 0 :(得分:4)
嗯,至于乘法,它并不是真正的C ++哲学:Ruby这样的语言包含“电池包含”和“最少惊喜的原则”。它们旨在将许多这些小细节作为超越最小特征。 C ++是一种系统级语言,旨在“更接近金属”,这一点非常清楚,string
甚至不是该语言的核心数据类型,而是库提供的插件。甚至FORTRAN都有一个本机字符串类型,因此您可以看到低级C ++的定位。这是故意的:如果您使用1K存储编程嵌入式芯片并且不使用字符串会怎么样?只是不要包括'em。
无论如何,它不是100%清楚乘法运算符应该做什么。换句话说,在C ++的核心语言和库中,没有任何功能可以进入,除非看起来几乎每个人都会同意所提议的功能。它必须真正普及。
我可能认为“123”* 3可以给出“369” - 将任何数字乘以3.我进一步提出这种解释是“理智的”,足以让重复的算子解释成为唯一的明确解释。
文字符号更容易回答:std::string
是标准库的一部分,它是语言语法本身之上的一个抽象层次。换句话说,文字符号会破坏抽象层次,将“语言特征”和“您希望与编译器捆绑在一起的库”分开。
答案 1 :(得分:1)
std :: string.append(numtimes,char to repeat);那里。确实如此。现在,这适用于字符文字,就像使用字符串一样,没有办法以声明的方式做到这一点。另外需要注意的是,std :: string类不是一种语言类型,c ++中的字符串litteral是const char *。一个指针。哪个数组衰减成指针,这就是std :: string类如何处理它包含的内容,一个字符数组,即char,或者stchar :: wstring的wchar_t。在那些类型上有模板化。