>>107
了解。forループを一般化するgeneric_forを考えよう。
この関数は、void *の初期状態とbool (*)(void *)の継続判定関数とvoid *(*)(void *)の状態更新関数と
void (*)(void *)のループ本体を取って、void *型のループ変数を使ったforループをエミュレートする。
void generic_for(void *init, bool (*pred)(void *), void *(*update)(void *), void (*body)(void *))
{
for(void *data = init; pred(data); data = update(data)) body(data);
}

generic_forを使って、intの配列の各要素(0が終端)を表示する関数printを書くことができる。
bool print_pred(void *pv) { return *(int *)pv; }
void print_body(void *pv) { std::cout << *(int *)pv << ' '; }
void print(int *a)
{
generic_for(a, print_pred, func, print_body); /* funcは>>101のもの */
}
これが「void *が必要で、かつポータブル」な例になってると思うがどうだろう。
この例自身は相変わらず役に立たないけど、書き換えて意味のある例を作るのは難しくないはず。