首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用c++11 lambda代码

使用c++11 lambda代码
EN

Stack Overflow用户
提问于 2015-05-13 18:14:22
回答 1查看 25关注 0票数 0

C++的新特性似乎是那些编写旧时尚代码的人的一种新语言。考虑这个函数

代码语言:javascript
复制
template<typename Type>
void Sequitur<Type>::printList(const Symbol * list, unsigned int number) const 
{
    list->forUntil([&number, this](const Symbol * item) {
        if(typeid(*item) == ValueType) {
          fout << static_cast<const Value*>(item)->getValue() << " ";
        }
        if(!--number) 
          return false;
        else 
          return true;
    });
}

这个内联函数定义在一个所谓的tpp文件中。

代码语言:javascript
复制
template<typename Child>
template<typename Function> const Child * BaseList<Child>::forUntil(const Function & f) const
{
  const BaseList * item = this;
  const BaseList * next;
  while(item) {
    next = item->next_ptr;
    if(!f(static_cast<const Child*>(item))) 
      break;
    item = next;
  }
  return static_cast<const Child*>(item);
}

假设所有的事情都是定义的,因为代码是工作的。我想要做的是添加一个计数器来计算执行while的次数。计数器值应该在printList()的末尾可用。

我怎样才能做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-13 18:20:28

这和兰巴达没有多大关系。如果希望获得迭代次数,而不是过于复杂代码,请将forUntil的返回类型更改为std::pair<const Child*, std::size_t>,其中retval.second是迭代计数。

另一方面,如果需要调用函子多少次,您可以自己跟踪它:

代码语言:javascript
复制
template<typename Type>
void Sequitur<Type>::printList(const Symbol * list, unsigned int number) const 
{
    std::size_t fCallNum = 0;

    list->forUntil([&](const Symbol * item) {
        ++fCallNum;
        if(typeid(*item) == ValueType) {
          fout << static_cast<const Value*>(item)->getValue() << " ";
        }
        if(!--number) 
          return false;
        else 
          return true;
    });

    std::cout << "Functor called " << fCallNum << " times\n";
}

在您的特殊情况下,这两个计数器将产生相同的值,但是,它们在语义上是不同的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30222377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档