【问题标题】:C++ sequence generator with init value by function enclosureC++ 序列生成器,具有函数外壳的初始值
【发布时间】:2019-02-25 18:42:33
【问题描述】:

我有一个问题:下面这段代码是否有效以及它是否最适合 C++14 中的序列生成器函数?

auto sequenceGen = [](int&& init) {
    int counter = init;
    return [counter=std::move(counter)]() mutable { return ++counter; };
};
auto getSeq1 = sequenceGen(100);
cout << getSeq1()<< endl;
cout << getSeq1()<< endl;

如果不是应该如何实现?

【问题讨论】:

  • “一段代码”。
  • 这很奇怪,至少。你为什么要通过右值引用传递一个 int ?参考大小与指针大小相同,int 相同或更小,以及为什么要移动它(考虑相同)。
  • auto const sequenceGen = [](int init){ return [init]()mutable{ return ++init; } }; 应该这样做(但不是线程安全的)。

标签: c++ design-patterns c++14 enclose


【解决方案1】:

int 这样的原始类型不会从移动语义中受益,因为移动与副本完全相同。您的代码可以简化为:

auto sequenceGen = [](int init) {
    return [init]() mutable { return ++init; };
};

auto getSeq1 = sequenceGen(100);
cout << getSeq1() << '\n';
cout << getSeq1() << '\n';

同时避免使用std::endl,除非你想强制刷新缓冲区,因为它与'\n'相比效率低。

【讨论】:

  • 感谢@vittorio-romeo,因为 int move 语义不是必需的,但这只是一种简化。我将使用它作为模板函数。
  • 如果您对此答案感到满意,请将其标记为已接受(并考虑投票)@JarodSmith
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多