Est-il possible de définir quelque chose comme ceci:Macro surcharge
#define FOO(x, y) BAR()
#define FOO(x, sth, y) BAR(sth)
pour que ceci:
FOO("daf", sfdas);
FOO("fdsfs", something, 5);
est traduit à ceci:
BAR();
BAR(something);
?
Éditer: En fait, BAR
sont des méthodes de ma classe. Désolé de ne pas avoir dit ça avant (je ne pensais pas que c'était pertinent).
Répondre à la question de DPJ:
class Testy
{
public:
void TestFunction(std::string one, std::string two, std::string three)
{
std::cout << one << two << three;
}
void AnotherOne(std::string one)
{
std::cout << one;
}
void AnotherOne(void)
{
std::cout << "";
}
};
#define PP_NARG(...) PP_NARG_(__VA_ARGS__,PP_RSEQ_N())
#define PP_NARG_(...) PP_ARG_N(__VA_ARGS__)
#define PP_ARG_N(_1, _2, _3, N, ...) N
#define PP_RSEQ_N() 3, 2, 1, 0
// macro for exactly 2 arguments
#define FOO_2(_1, _2) AnotherOne()
// macro for exactly 3 arguments
#define FOO_3(_1, _2, _3) AnotherOne(_2)
// macro selection by number of arguments
#define FOO_(N) FOO_##N
#define FOO_EVAL(N) FOO_(N)
#define TestFunction(...) FOO_EVAL(PP_NARG(__VA_ARGS__))(__VA_ARGS__)
Et appelez:
Testy testy;
testy.TestFunction("one", "two", "three"); // line 9
sortie du compilateur:
Avertissement 1 Avertissement C4003: pas assez de paramètres réels pour macro 'PP_ARG_N' principale. cpp 9
Avertissement 2 avertissement C4003: pas assez de paramètres réels de macro main.cpp 'foo_' 9
d'erreur 3 erreur C2039: 'foo_': ne fait pas partie de main.cpp 'Testy' 9
Pourquoi utiliser des macros? – 0x499602D2
Il est possible de le laisser développer 'BAR (sfdas);' et 'BAR (quelque chose, 5);' respectivement. Est-ce acceptable? Les macros ne peuvent pas "ignorer" le dernier paramètre, mais elles peuvent rejeter la première. – leemes
Voir aussi http://stackoverflow.com/questions/3850421/can-i-define-variadic-c-preprocessor-macros-with-va-args-in-the-middle-instead – leemes