Не знаю, может баян, но занятный макрос:
#define COUNT_PARMS2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _, ...) _
#define COUNT_PARMS(...) COUNT_PARMS2(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
Дальше можно передать параметром в функцию:
#define print_strings(...) print_strings2(COUNT_PARMS(__VA_ARGS__), __VA_ARGS__)
или просто приклеить к имени:
#define CAT(A, B) CAT2(A, B)
#define CAT2(A, B) A ## B
#define cpp_overload(...) CAT(cpp_overload, COUNT_PARMS(__VA_ARGS__))(__VA_ARGS__)
Дальше ещё интереснее — параметры по-умолчанию:
#define cpp_default1(A) cpp_default2(A, "default string")
void cpp_default2(int x, const char *s);
#define cpp_default(...) CAT(cpp_default, COUNT_PARMS(__VA_ARGS__))(__VA_ARGS__)
Подглядено тут:
http://locklessinc.com/articles/overloading/
Там ещё пара приёмов по перегрузке по sizeof, и с использованием интринсиков gcc __builtin_choose_expr/__builtin_types_compatible_p.
Правда мою проблему как перегрузить (для студии):
float sqrt(float);
double sqrt(double);
не решает.
з.ы. с COUNT_PARMS похоже будут проблемы при передаче 0 аргументов, и аргументов с запятыми