【问题标题】:QAbstractItemModel foreach iterator with functors: is there a better way to do this?QAbstractItemModel foreach 带有仿函数的迭代器:有没有更好的方法来做到这一点?
【发布时间】:2014-09-25 14:20:10
【问题描述】:

我正在编辑 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 的签名应该是什么。如果你给它一些错误,你会得到一个编译错误,但我担心这可能是一个糟糕的接口(或者一般来说是一个糟糕的编码实践)来创建这些类型的函数。

在接受参数时,为了清楚起见请求函数指针会更好吗?我应该注意的一种方式与另一种方式相比有什么影响或限制吗?

【问题讨论】:

  • 标准库只是记录了函数的预期签名。创建 std::function,因为它使用类型擦除,因此会降低普通函数或 lambda 的性能。

标签: qt templates c++11 coding-style functor


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 2014-04-13
    相关资源
    最近更新 更多