Вы не хотите делать это с макросами в C ++; функция в порядке:
char const* num_name(int n, char const* default_=0) {
// you could change the default_ to something else if desired
static char const* names[] = {"Zero", "One", "Two", "..."};
if (0 <= n && n < (sizeof names / sizeof *names)) {
return names[n];
}
return default_;
}
int main() {
cout << num_name(42, "Many") << '\n';
char const* name = num_name(35);
if (!name) { // using the null pointer default_ value as I have above
// name not defined, handle however you like
}
return 0;
}
Аналогично, квадрат должен быть функцией:
inline int square(int n) {
return n * n;
}
(Хотя на практике квадрат не очень полезен, вы бы просто умножили напрямую.)
В качестве любопытства, хотя я бы не рекомендовал его в этом случае (вышеуказанная функция подходит), шаблонный эквивалент метапрограммирования будет:
template<unsigned N> // could also be int if desired
struct NumName {
static char const* name(char const* default_=0) { return default_; }
};
#define G(NUM,NAME) \
template<> struct NumName<NUM> { \
static char const* name(char const* default_=0) { return NAME; } \
};
G(0,"Zero")
G(1,"One")
G(2,"Two")
G(3,"Three")
// ...
#undef G
Обратите внимание, что основной способ примера TMP дает сбой - вы должны использовать константы времени компиляции вместо любых int.