Самый простой способ - использовать apply и tie:
auto assign = [](std::size_t ith, auto& member) {
if (member) {
my_array[ith] = my_fun(member);
}
};
std::apply(
[&assign](auto&... members) {
std::size_t ith = 0;
(assign(ith++, members), ...);
},
std::tie(
my_struct.head_,
my_struct.tail_,
my_struct.left_head_,
my_struct.left_tail_,
my_struct.right_head_,
my_struct.right_tail_
)
);
В C ++ 20, однако, вы можете использовать операторы расширения для итерации по агрегатному типу:
std::size_t ith = 0;
for...(auto& member : my_struct) {
if (member) {
my_array[ith++] = my_fun(member);
}
}