https://gcc.godbolt.org/z/Kvq6dEGTf
Задумался, как можно было бы реализовать такую штуковину...
Если среди множества перегрузок функции есть несколько одинаково хорошо подходящих, то компилятор выдаёт ошибку неоднозначности.
Один из способов разрешения неоднозначности — это указание приоритета.
Выглядеть это может примерно так:
int fun(prio<0>, auto&&...) { return __LINE__; }
int fun(prio<5>, int) { return __LINE__; }
int fun(prio<5>, const char*) { return __LINE__; }
int fun(prio<10>, int&) { return __LINE__; }
int fun(prio<10>) { return __LINE__; } // перегрузка с другим количеством аргументов
//int fun(prio<20>, short) { return __LINE__; }
int fun(prio<20>, short&) { return __LINE__; }
int fun(prio<20>, long&) { return __LINE__; }
int fun(prio<30>, int, int) { return __LINE__; }
DEFINE_DISPATCH(do_fun, fun)
#include <iostream>
#define TEST(expr) std::cout << #expr << " = " << (expr) << std::endl;
int main() {
TEST(do_fun());
TEST(do_fun(1));
TEST(do_fun(""));
int x;
TEST(do_fun(x));
long y;
TEST(do_fun(y));
float z;
TEST(do_fun(z));
TEST(do_fun(1, 2));
short t;
TEST(do_fun(t));
}
По ссылке — моя частично успешная попытка.
По каждой из "частично" заведу отдельные комментарии ниже.