列挙値が0から始まり、増加した場合、ある種の配列アクセスを使用できると思います:
const char *distanceUnitToString2(enum DistanceUnit unit)
{
const char *values[] = {
"cm",
"m",
"km"
};
// do some sanity checking here
// ...
return values[unit];
}
しかし、これは私には少し不安定に感じます。負の値がある場合、または のようなビットマスク スタイルの列挙値を使用している場合はどうなります1 << 8
か? 非常に大きな配列を使用することになります。
スイッチを使用して、マクロで少し改善することもできます。このようなもの:
const char *distanceUnitToString(enum DistanceUnit unit)
{
#define CASE(UNIT, STRING) case (UNIT): return (STRING)
switch (unit) {
CASE(kCentimeters, "cm");
CASE(kMeters, "m");
CASE(kKiloMeters, "km");
default:
// should not get here
assert(0);
break;
}
#undef CASE
}
しかし、マクロを使用しない場合と比較して、実際にはそれほど節約できません。