Takie elementy jak flagi czy "surowe czytania po pamięci", generalnie mają sens tylko blisko sprzętu albo w trakcie głębokiej optymalizacji. Flagi np. występują wtedy bardzo często jako znacznik w danym rejestrze/porcie i ... tak jest :)
Co do goto, jest kilka przypadków gdy broni się w C (bez plusów). Co do C++, goto jest zbędne w codziennym stosowaniu.
Nie bardzo rozumiem i nie wiem czy nie przekombinowałeś. Jeśli chodzi o sekwencyjne przeglądanie a nie jakieś kombinacje typu złączenie kartezjańskie czy połączenie par, to przecież taki kod załatwia sprawę. Coś więcej można powiedzieć jeśli zna się dokładniej domenę problemu. Bez gwarancji że trafiam, ale zerknij do algorytmów. Szczególnie std::accumulate, std::transform, std::generate, std::all_of, std::any_of ...
#include <iostream>
template<typename Condition, typename Effect>
void run_action(int * tab, size_t size, Condition condition, Effect effect) {
for (auto i = 0U; i < 10; ++i) {
for (auto j = i + 1; j < 10; ++j) {
if (condition(tab[i], tab[j])) {
effect(tab[i], tab[j]);
}
}
}
}
bool condition(int a, int b) {
return !(b % a);
}
void effect(int a, int b) {
std::cout << b << " divided by " << a << '\n';
}
int main() {
int tab[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
run_action(tab, 10, condition, effect);
}