【问题标题】:Why doesn't std::string define multiplication or literals? [closed]为什么 std::string 不定义乘法或文字? [关闭]
【发布时间】:2012-05-22 09:44:04
【问题描述】:

在我第一次接触的语言中,有一个函数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 &lt;&lt; '1's + '2's;

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

【问题讨论】:

  • 请记住 c++ 不是 perl...
  • 它可能不是,也不是我所引用的,但他们一直在使 C++ 更加用户友好。看看auto。他们从来没有想过这些吗?
  • @fontanini,除了s 是保留后缀之外,如果每次我想使用它时它已经在那里,我会看到它更方便。
  • typedef std::string s; cout &lt;&lt; s("123") * 3;
  • 我真的无法理解constructor #2 尚未涵盖的实际用例。真的吗?在真实代码中?

标签: c++ string c++11 multiplication user-defined-literals


【解决方案1】:

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

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

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

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

【讨论】:

  • 我只是好奇,运营商还会做什么?
  • 特别是,std::string 文字的语法要求编译器能够构造一个有效的std::string,因此它必须知道其实现的细节。从理论上讲,如果您想交换标准库的不同实现,这会妨碍您。实际上,从来没有人真正这样做过,但是 C++ 中的许多设计决策都是基于理论而非实际考虑。跨度>
  • 关于那个用途,我明白你的意思。我从来没想过那个。我想考虑到上下文,这可能是有道理的。 @RussellBorogove,我明白你的意思。
  • 在使用具有内置字符串数据类型的更现代的语言之后,C++ 的演变历史似乎是一种尝试添加实现终极万事万物字符串所需的所有功能数据类型。
  • @Russell:我敢打赌不知道你在说什么。我看到的关于std::string 的每一个合理的抱怨都是它缺乏功能,而不是多余的。
【解决方案2】:

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

【讨论】:

  • 在我看来,它仍然比s += 3 * "str"s; 低了一步。前者可能是晶莹剔透的,但后者流出得很好。
  • 一个人不能乘以字符串,这在其他语言中意味着什么超出了我的理解,AFIK 你甚至不能在 c# 或 java 中做到这一点。
  • 您必须记住,C++ 不是一种解释型语言,它也不受管理。有很多关于语言的语法允许它尽可能接近金属,但仍然保留非常快速和强大的抽象远离机器,我的意思是,如果你需要,你可以旋转位,但是在大多数情况下,这根本不需要,而且当可以使用良好的 c++ 构造时,我经常会看到过于复杂的代码。需要注意的是,您可能可以使用简单的表达式模板来实现您想要做的事情。
  • @chris : 现有的真正软件有什么机会做这样的事情?方便吗?当然。需要吗?绝对不是
猜你喜欢
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
  • 2013-01-28
  • 2020-03-28
  • 1970-01-01
  • 2021-11-01
相关资源
最近更新 更多