QAbstractItemModel使用仿函数预处理迭代器:有更好的方法吗?

Nic*_*aus 5 qt templates coding-style functor c++11

我正在编辑QDomModel简单示例,为我的应用程序添加一些内容,并且需要清除偶尔添加的一些状态标志.迭代QAbstractItem模型的项目有点烦人,因为没有提供标准迭代器,所以我编写了自己的for_each-style函数来迭代每个项目并对其执行函数'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);  
}
Run Code Online (Sandbox Code Playgroud)

这是有效的,我可以给它各种伟大的lambdas或仿函数,并称之为:

void QDomModel::clearChanges()
{
    foreach_item([&](QModelIndex parent)
    {   
        QDomItem* item = static_cast<QDomItem*>(parent.internalPointer());
        item->valueChanged = false;
    });
    changeCount = 0;
}
Run Code Online (Sandbox Code Playgroud)

这是非常强大的,但我遇到的问题是,除非你挖掘代码,否则你不知道functor/lambda的签名应该是什么.如果你给它一些错误,你会得到一个编译错误,但我担心这可能是一个糟糕的接口(或一般的错误编码实践)来创建这些类型的函数.

在接受参数时,为了清晰起见,请求函数指针是否更好?对于我应该注意的另一种方式,是否存在任何影响或限制?

jtu*_*tte 2

std::function将允许您公开签名中的类型。尝试类似的方法:

void foreach_item(const std::function<void(const QModelIndex&)> &f, QModelIndex parent = QModelIndex())
{
    /*...*/
}
Run Code Online (Sandbox Code Playgroud)