【发布时间】: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