Какой самый эффективный способ итерации по одному из нескольких известных диапазонов, основанный на некотором условии?
псевдокод для двоичного условия:
for element in (condition ? range_a : range_b)
// do work
В этом "примере" показано мое намерение использовать цикл for на основе диапазона, но, поскольку std::initializer_list
имеет ссылочную семантику, он не будет работать.
constexpr auto some_range(bool c) -> std::initializer_list<int> {
if (c) {
return {1,2};
} else {
return {3, 4, 5};
}
}
bool cond = true; // false
for(auto x : some_range(cond)) {
// things
}
выход: warning: returning address of local temporary object [-Wreturn-stack-address]
Во время выполнения я мог бы вернуть std::vector
, но это потребовало бы создания нового вектора при каждом вызове:
auto some_range(bool c) -> std::vector<int> {
if (c) {
return {1,2};
} else {
return {3, 4, 5};
}
}
Я мог бы использовать фиксированный размер std::array
из std::optional<int>
, но мне пришлось прибегнуть к решению С++ 14 или c ++ 11.