私の経験では、実世界で非負の整数のインデックスが提供されることはめったにありません。多くのことは数値化さえされていません。そして、数値で表現されたインデックスを使用する多くのものは、インデックスが 0 から始まりません。では、なぜ整数インデックス配列にまだ限定されているのでしょうか?
多分私は間違っているかもしれませんが、列挙型のインデックス付き配列は、数値インデックス付きの配列よりも適切であることが多いようです (列挙型は多くの場合、より正確な「現実の」表現であるため)。多くの場合、列挙型は比較的簡単にCスタイルの配列インデックスに変換できます...
enum Weekday = {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
// hopefully C doesn't allow nonsequential enum values; else pray to God
// no one does something like setting Sunday = 4 and Saturday = 4096
int numberOfDays = Saturday-Sunday+1;
int hoursWorkedPerDay[numberOfDays];
hoursWorkedPerDay[(int)SUNDAY] = 0;
hoursWorkedPerDay[(int)MONDAY] = 8;
hoursWorkedPerDay[(int)TUESDAY] = 10;
hoursWorkedPerDay[(int)WEDNESDAY] = 6;
hoursWorkedPerDay[(int)THURSDAY] = 8;
hoursWorkedPerDay[(int)FRIDAY] = 8;
hoursWorkedPerDay[(int)SATURDAY] = 0;
...列挙型の数と配列のサイズの間で一貫性を維持する必要があります (ただし、「SUNDAY」には 0 よりも有効な整数マッピングがないため、これはひどい解決策ではありません)。さらに重要なことは、 、int にキャストできるものはすべてインデックスにドロップして、配列を操作できます。
// continued from above
void resetHours (void) {
int i = 0;
int hours = 0;
for (i = 0; i<numberOfDays; i++) {
hoursWorkedPerDay[hours] = i;
// oops, should have been: "...[i] = hours;"
// an enum-indexed implementation would have caught this
// during compilation
}
}
さらに、enum から int への変換全体は、不要に思える複雑なレイヤー全体です。
誰かが列挙型インデックスに妥当性があるかどうかを説明し、各アプローチの長所と短所を挙げてもらえますか? そして、もしそのような情報が存在するのなら、なぜこれほど便利に見える機能が C 標準から欠落しているのでしょうか?