【发布时间】:2020-06-21 23:16:36
【问题描述】:
我正在编写一个作用于IShellItemArrays 的大型函数库。实际上,所有函数都需要单独访问数组中的每个IShellItem(更具体地说,每个IShellItem2)。因此,除非我忽略了文档中的某些内容,否则我相信我必须这样做:
void SomeFunc(IShellItemArray* psia)
{
HRESULT hr;
DWORD cItems;
hr = psia->GetCount(&cItems);
if (FAILED(hr) || cItems == 0)
{
return;
}
for (UINT i = 0; i < cItems; ++i)
{
CComPtr<IShellItem> pShellItem;
hr = psia->GetItemAt(i, &pShellItem);
if (FAILED(hr))
{
continue;
}
CComPtr<IShellItem2> pShellItem2;
pShellItem->QueryInterface(&pShellItem2);
if (FAILED(hr))
{
continue;
}
// ...
}
}
现在我正在尝试将那个迭代抽象出来,这样我就不必每次都编写它了。到目前为止,我已经尝试创建一个 ForEachShellItem 辅助函数来执行迭代并将所需的函数应用于每个项目,如下所示:
void ForEachShellItem(IShellItemArray* psia, HRESULT(*fn)(IShellItem2*))
{
HRESULT hr;
DWORD cItems;
hr = psia->GetCount(&cItems);
if (FAILED(hr) || cItems == 0)
{
return;
}
for (UINT i = 0; i < cItems; ++i)
{
CComPtr<IShellItem> pShellItem;
hr = psia->GetItemAt(i, &pShellItem);
if (FAILED(hr))
{
continue;
}
CComPtr<IShellItem2> pShellItem2;
pShellItem->QueryInterface(&pShellItem2);
if (FAILED(hr))
{
continue;
}
fn(pShellItem2);
}
}
问题在于,如果必要的函数与函数指针参数的签名不同,那么这将不起作用。那么有没有办法概括或模板化这种方法?或者是否有任何其他策略来避免重复迭代代码?感谢您的任何意见。
【问题讨论】:
-
取第二个参数为
std::function或仿函数。