Инициализация объекта std::initializer_list (С++)
У меня есть функция, которая принимает в аргументах 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();
}
Но так и не нашел внятного ответа, можно ли, и если можно, то как?
Ответы (1 шт):
Никак нельзя. Вместо std::initializer_list лучше взять std::span<const CEventArg>.
Вектор в такой параметр можно передавать напрямую.
Список в фигурных скобках напрямую не получится, вместо него можно std::array<CEventArg>{...}. Или добавить вторую перегрузку с параметром initializer_list, из которой вызывать основную перегрузку, передавая в этот параметр {l.begin(), l.end()}.