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的签名应该是什么.如果你给它一些错误,你会得到一个编译错误,但我担心这可能是一个糟糕的接口(或一般的错误编码实践)来创建这些类型的函数.
在接受参数时,为了清晰起见,请求函数指针是否更好?对于我应该注意的另一种方式,是否存在任何影响或限制?
std::function将允许您公开签名中的类型。尝试类似的方法:
void foreach_item(const std::function<void(const QModelIndex&)> &f, QModelIndex parent = QModelIndex())
{
/*...*/
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1551 次 |
| 最近记录: |