Я поклонник "петли foreach на основе лямбда":
class SomeDataStructure
{
private:
std::vector<SomeData> data;
public:
template<typename TF> void forData(TF mFn)
{
for(int i{0}; i < data.size(); ++i)
mFn(i, data[i]);
}
};
SomeDataStructure sds;
int main()
{
sds.forData([](auto idx, auto& data)
{
// ...
});
}
Я думаю, что это хорошая абстракция для более сложных структур данных, поскольку она позволяет пользователю интуитивно обходить их содержимое с помощью дополнительных параметров. И оптимизация компилятора должна гарантировать производительность, равную традиционному циклу for(...)
.
К сожалению, использование таких lambdas явно предотвращает использование иногда полезных операторов continue;
и break;
.
sds.forData([](auto idx, auto& data)
{
// Not valid!
if(data.isInvalid()) continue;
});
Есть ли способ имитировать операторы continue;
и break;
без потери производительности и не сделать синтаксис менее удобным?