перегрузки с приоритетами
От: Кодт Россия  
Дата: 29.06.23 22:56
Оценка: 2 (1)
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));
}


По ссылке — моя частично успешная попытка.
По каждой из "частично" заведу отдельные комментарии ниже.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.