C++的新特性似乎是那些编写旧时尚代码的人的一种新语言。考虑这个函数
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文件中。
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()的末尾可用。
我怎样才能做到这一点?
发布于 2015-05-13 18:20:28
这和兰巴达没有多大关系。如果希望获得迭代次数,而不是过于复杂代码,请将forUntil的返回类型更改为std::pair<const Child*, std::size_t>,其中retval.second是迭代计数。
另一方面,如果需要调用函子多少次,您可以自己跟踪它:
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";
}在您的特殊情况下,这两个计数器将产生相同的值,但是,它们在语义上是不同的。
https://stackoverflow.com/questions/30222377
复制相似问题