作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编辑 QDomModel 简单示例,为我的应用程序添加一些内容,并且需要清除我偶尔添加的一些状态标志。迭代 QAbstractItem 模型的项目有点烦人,因为没有提供标准迭代器,所以我编写了自己的 for_each 样式函数来迭代每个项目并对其执行函数“f”。
template<typename Functor>
void foreach_item(Functor f, QModelIndex &parent = QModelIndex())
{
if (!parent.isValid())
parent = index(0,0,QModelIndex());
int numRows = rowCount(parent);
for (int i=0; i<numRows; i++)
{
foreach_item(f,index(i,0,parent));
}
f(parent);
}
这可行,我可以给它各种很棒的 lambda 或仿函数,并像这样调用它:
void QDomModel::clearChanges()
{
foreach_item([&](QModelIndex parent)
{
QDomItem* item = static_cast<QDomItem*>(parent.internalPointer());
item->valueChanged = false;
});
changeCount = 0;
}
这非常强大,但我遇到的问题是,除非您深入研究代码,否则您不知道仿函数/lambda 的签名应该是什么。如果你给它错误的东西,你确实会得到一个编译错误,但我担心这对于创建这些类型的函数来说可能是一个糟糕的接口(interface)(或者通常是一个糟糕的编码实践)。
在接受参数时,为了清楚起见,询问函数指针是否更好?我应该注意一种方式与另一种方式相比是否有任何影响或限制?
最佳答案
std::function
将允许您公开签名中的类型。尝试这样的事情:
void foreach_item(const std::function<void(const QModelIndex&)> &f, QModelIndex parent = QModelIndex())
{
/*...*/
}
关于qt - 带有仿函数的 QAbstractItemModel foreach 迭代器 : is there a better way to do this?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26040977/
我是一名优秀的程序员,十分优秀!