Vous ne voulez pas faire cela avec des macros en C++; une fonction est très bien:
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;
}
De même que carré doit être une fonction:
inline int square(int n) {
return n * n;
}
(Bien que, dans la pratique carré est pas très utile, vous devriez juste multiplier directement. Comme une curiosité, bien que je ne le recommanderais pas dans ce cas (la fonction ci-dessus est bien), un toupet e équivalent méta-programmation serait:
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
Notez que le principal moyen de l'exemple TMP n'est que vous devez utiliser des constantes de compilation du temps au lieu d'un int.
Pourquoi ne pas simplement une fonction normale? –
Ce que Martin a dit - et votre exemple de macro 'square()' montre une des raisons pour lesquelles: il est si facile d'obtenir des macros erronées. La macro 'square()' devrait ressembler plus à '#define square (x) ((x) * (x))' pour éviter les problèmes avec des choses comme 'square (1 + 4)' renvoyant 9 au lieu de 25. Même avec ce correctif, il est difficile d'empêcher un comportement incorrect avec des arguments qui ont des effets secondaires. Une fonction évite ces problèmes et n'aura probablement aucun impact notable sur les performances (en particulier si elle peut être transformée en «inline»). –
En utilisant des macros simples ou des fonctions en ligne, les performances sont-elles atteintes uniquement au moment de la compilation ou de l'exécution? – cpx