Разверните пакет параметров в порядке
У меня есть функция, которая принимает кортеж, и я хочу перебрать членов кортежа по порядку. Моя текущая версия зависит от компилятора, потому что она использует параметры функции для распаковки членов кортежа (в std::make_tuple()
).
Я построил упрощенный пример того, что я делаю:
template<typename T>
void* printMember(T const& d)
{
std::cout << d << " ";
return nullptr;
}
template<typename Members, std::size_t... Seq>
void printTuppleMembers(Members const& members, std::index_sequence<Seq...> const&)
{
std::make_tuple(printMember(std::get<Seq>(member))...);
}
template<typename... Members>
void printTupple(std::tuple<Members...> const& members)
{
printTuppleMembers(members, std::make_index_sequence<sizeof...(Members)>());
}
Я не могу придумать способ заставить призвание printMember()
для каждого члена набора, так что это происходит для членов 0..n в правильном порядке.
Я пытался использовать списки инициализатора.
std::make_tuple({printMember(std::get<Seq>(member))...});
// ^ ^
Но это не скомпилировано.
В настоящее время он работает в моей системе, но я хотел бы общее решение, которое работает на всех системах.
1 ответ
Расширение пакета внутри списка инициализированных скобок гарантируется слева направо:
auto discard = {0, (printMember(std::get<Seq>(members)), 0)...};
(void)discard;