我有一个接受参数的函数std::initializer_list
void CEventManager::sendEvent(EEventType eEventType, const std::initializer_list<CEventArg> &rcEventArgs) noexcept
{
// Найти список (вектор) в ассоциативном массиве (map) По типу события
auto it = m_cEventHandlers.find(eEventType);
// Если найден
if (it != m_cEventHandlers.end())
{
// Пройтись по всем элементам списка (слушателям) и вызывать функцию обработки события
for (auto& handler : it->second)
{
handler->handleEvent(eEventType, rcEventArgs);
}
}
}
我使用完全initializer_list不是vector因为我在某处读到这是一个非常快速和高效的容器,它允许您实现可变数量参数的传输。
我需要通过使用向量初始化 rcEventArgs 参数来调用此函数。也就是说,我有一个向量,其中包含我想传递的参数列表。
void CEventManager::update([[maybe_unused]] float fDelta)
{
// Заблокировать чтение/запись массива отложенных событий
m_cMutexQueuedEvents.lock();
// Последнее отложенное событие
auto& rsEventInfo = m_cQueuedEvents.back();
// Список аргументов события
auto cArgList = std::initializer_list<CEventArg>(/*Как добавить сюда мои аргументы из вектора динамически???*/);
// Отправить
this->sendEvent(rsEventInfo.m_eEventType, cArgList);
// Удалить отложенное событие из списка
m_cQueuedEvents.pop_back();
// Разблокировать чтение/запись массива отложенных событий
m_cMutexQueuedEvents.unlock();
}
但是我没有找到明确的答案,有没有可能,如果有,怎么做?
不可能。
std::initializer_list最好取而代之std::span<const CEventArg>。向量可以直接传递给这样的参数。
花括号中的列表不能直接使用,您可以使用
std::array<CEventArg>{...}. 或者添加带有参数的第二个重载initializer_list,从中调用主重载,传入这个参数{l.begin(), l.end()}。