如何将初始化列表作为函数参数传递

How to pass an initializer list as a function argument?

本文关键字:函数 参数传递 列表 初始化      更新时间:2023-10-16

基本上,我希望做这样的事情:

HANDLE hThread1 = CreateThread(...);
HANDLE hThread2 = CreateThread(...);
HANDLE hThread3 = CreateThread(...);
...
WaitForMultipleObjects( 3, {hThread1,hThread2,hThread3}, FALSE, INFINITE );

而不是:

HANDLE hThread[3];
hThread[0] = CreateThread(...);
hThread[1] = CreateThread(...);
hThread[2] = CreateThread(...);
...
WaitForMultipleObjects( 3, hThread, FALSE, INFINITE );

我找到的唯一解决方案是使用std::initializer_list,但显然WaitForMultipleObjects()不接受std::initializer_list

那就写一个包装器吧。

DWORD wait_for_multiple_objects(
    std::initializer_list<HANDLE> handles,
    bool wait_all = false, DWORD time = INFINITE
) {
    return WaitForMultipleObjects(
        handles.size(), &*handles.begin(), wait_all, time
    );
}

现在你可以这样做:

wait_for_multiple_objects({ handle1, handle2, handle3 });

这显然需要c++ 11编译器支持initializer_list。如果您希望传递一个已经存在的参数,std::vector<HANDLE>可能是一个更好的参数类型。或者更通用的迭代器/范围接口,但这留给读者作为练习。