【问题标题】:Is it possible to write code like this in C++11 without using boost?是否可以在不使用 boost 的情况下在 C++11 中编写这样的代码?
【发布时间】:2013-04-22 02:56:07
【问题描述】:

不久前,我偶然发现了一个 以下代码行:

 return accumulate(s, s + size, char(), (_1 ^ _2));

它使用了 boost headers,但我一直认为它非常非常优雅(注意 lambda 没有命名输入参数,所以它非常短。:) 请注意,我知道 C++11 有 lambda 函数,这不是关于 lambdas,而是关于这个漂亮的简短语法。

【问题讨论】:

  • 我不确定你的问题,^ 可以重载所以有可能。
  • ^ 是什么意思?它在 C 和 C++ 中是什么意思,或者在其他语言中是什么意思?
  • 代码执行异或校验和:),所以^是正常的^ ... ^_^
  • 您愿意在其背后投入多少机器?显然,你不能开箱即用。但是你显然也可以像 Boost.Lambda 那样构建一个处理它的库。
  • 这些用于std::bind,它允许您将参数重新排列(或硬编码)到预先存在的仿函数。它不提供 Boost.Lambda 提供的动态自定义仿函数生成。它在这里的使用看起来与您提供的示例不同。这将非常不吸引人,也没有必要,因为您可以只传递一个std::bit_xor 对象。无需重新排列参数。

标签: c++ boost c++11 lambda


【解决方案1】:

使用硬编码类型...

return accumulate(s, s+size, char(), [](char l, char r){ return l ^ r; });

generic lambdas 被允许时 (C++14)...

return accumulate(s, s+size, char(), [](auto l, auto r){ return l ^ r; });

现在,std::bit_xor...

return accumulate(s, s+size, char(), bit_xor<char>());

【讨论】:

  • 我知道这是可能的,我正在寻找可以在不为 lambda 定义输入参数的情况下工作的语法...
  • @BenjaminLindley 哦,哈哈。不知道存在...谢谢。
【解决方案2】:

没有 Boost 的唯一方法是重新发明创建它的 Boost 组件。如果没有 Boost 组件的实现,你怎么可能拥有 Boost 组件的语法?

语言解决方案是 lambda,如果您不喜欢它们,那么是时候使用 Boost 或窃取其中的特定部分了。

【讨论】:

  • 我认为 ISO 委员会足够聪明,可以实现一个很酷的功能......我不是第一次犯这个错误 :P 虽然我猜它不能完成,但我想确定因为喜欢我说我真的很喜欢这种语法。
  • @NoSenseEtAl:如果没有人提出建议,委员会就不能因为没有使用语言而大吃一惊。
  • “我认为 ISO 委员会很聪明,可以实现一个很酷的功能” - 当然是。而且你知道吗,它们甚至足够聪明,不会实现人们可能会发现“酷”的每一个功能。 Boost 是功能丰富的库的大量选择,而不是下一个标准的事实上的模型。我们终于有了 lambda。好的,它们不像您的示例那样整洁,但它们很好地集成到现有语言中,并且不会将语言语法混淆成完全不同的东西。他们使像 Boost.Lambda 这样的库解决方案过时了,如果你仍然想要它,就使用它。
  • @ChristianRau 好吧,实际上恰恰相反,Boost Lambda 使 C++11 lambda 语法在标准化的那一刻就过时了。 :D 但是我真的不想浪费时间争论我喜欢的语法是否比你喜欢的语法更好,因为它不是一个科学可衡量的东西:)
  • @NoSenseEtAl:C++11 lambda 语法比 Boost.Lambda 更加通用和有用。创建 C++11 lambda 的全部原因是因为 Boost.Lambda 不够好
猜你喜欢
  • 2019-02-12
  • 2016-03-31
  • 1970-01-01
  • 2014-01-21
  • 1970-01-01
  • 2018-05-26
  • 2017-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多