【问题标题】:Why C++ has no concise syntax that allow executing an operation multiple times without defining a counter? [duplicate]为什么 C++ 没有简洁的语法允许在不定义计数器的情况下多次执行操作? [复制]
【发布时间】:2019-04-12 14:52:04
【问题描述】:

我想多次执行单个操作,而不定义计数器。例如,像这样:

do(10)
{
    //do something
}

我认为这在几种不同的情况下会很有用。例如:

  • 通过起始索引从std::list 中删除多个连续项目。
  • 在一段时间内或在某个特定时间多次发出某些信号。
  • 将相同的数据添加到列表中以进行自定义初始化 许多场景不限于上面列出的场景。

其他语言有类似这样的语法,允许重复执行相同的命令,而不必显式定义计数器变量。在我看来,定义计数器完全不符合人类的思维。

模拟我们的想法:

实际上,我们总是在做某事。直接几次。

但是现在的语法是这样的:

  • 呃……我要做某事。三遍。
  • 好的,准备好了,我开始了。

灵魂拷问:为什么 C++ 不提供简洁的语法?虽然我是 C++ 的粉丝,但我不禁想为什么有些人不喜欢 C++,因为 C++ 很少考虑人们的想法。我希望 C++ 能够与时俱进,成为未来的编程语言。

不同于Modern C++ way to repeat code for set number of times。我给出了我的计划,应用场景,甚至情感诉求。

【问题讨论】:

  • for (int i = 0; i < 10; ++i) 是不是很糟糕?至少它概括
  • while (true) { /* do something */ } 多次执行某项操作。看不到柜台;)
  • for 的一般形式相反,存在这种语法有什么好处?
  • 据我所知,完全按照 OP 的建议将其放入 C++ 不会是一个重大变化。 ISO家伙会讨厌它。在初始化向量时甚至可能很有用。它还具有不会将计数变量泄漏到循环体中的优点。
  • 为什么会存在?您能为此类功能提出一个有意义的用例吗?在幼儿园级别的“学习”语言中向孩子介绍编程是有意义的。但是,在任何真正的工业级语言中,这样做的目的是什么?哪里可能需要多次重复相同的动作?我的意思是,我可以强迫自己去想一些这样的例子,但它们是如此的稀有和人为的......这并不能证明引入一个专门的语言特性是合理的。

标签: c++ c++11 c++17


【解决方案1】:

C++ 的发展是由委员会决定的。用最简单的话来说,人们提出的东西,委员会接受或拒绝。

你的建议很有趣

do (integral_expression)
{
}

不会是重大变化。请注意,循环体之后没有while,或者与do 相邻的whileintegral_expression 几乎是 C++ 中的生产规则,以防 switch 块的标签,尽管在这种情况下它可能是运行时可评估的。它甚至可以用来清理代码,相当于

for (int i = 0; i < integral_expression; ++i)
{
}

i 引入循环体,这可能会带来不便,因为它可以隐藏现有的i

也就是说,需要考虑积分表达式为负的情况。也许引入unsigned_integral_expression 与在标准 C++ 的合理通用扩展中声明可变长度数组时需要编写为大小表达式不同?

如果你想要 C++ 中的这个特性,那为什么不提出呢?

【讨论】:

  • 我认为它更容易用于:for (integral_expression) {}
【解决方案2】:

这是一个 C++ 代码示例,它将执行给定次数的操作。也可以在 C 中完成,但函子必须是函数指针。

这可能有一个用例,但我认为对于 C++ 程序,标准循环语法会更可取。

#include <iostream>
#include <functional>

static void Do(int count, std::function<void(int)> fn)
{
    while(count)
    {
        if (count > 0) --count;
        else if (count < 0) ++count;

        fn(count);
    }
}

int main()
{
    Do(10, [](int count) { std::cout << "Loop is at " << count << "\n"; });
}

【讨论】:

    【解决方案3】:

    如果需要,lambda 可以实现干净的纯库:

    template<typename F>
    constexpr void repeat(std::size_t const n,F const& f){
       for (std::size_t i=0;i<n;++i)
           f();
    };
    
    int x{};
    repeat(5,[&]{
       std::cout << ++x << std::endl;
    });
    

    除非有更大的理由支持,否则这样的提案很可能会被委员会否决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      • 2012-12-06
      • 1970-01-01
      • 2017-06-27
      • 2013-03-14
      相关资源
      最近更新 更多