Re[5]: перегрузки с приоритетами
От: Кодт Россия  
Дата: 30.06.23 20:56
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>>>А что мешает вместо dispatch делать return_function, а у неё брать сигнатуру ?

К>>То, что семейство функций — не первоклассный объект. Как ты из hf вернёшь f?
_>А что мешает вместо line возвращать функцию или её номер.

__LINE__ — это чисто для демонстрации, просто чтоб видеть, что где произошло.
Можно возвращать __PRETTY_FUNCTION__ например.

Но дело в другом. Вернуть уникальный идентификатор функции несложно, если функция однозначно была выбрана как наилучшая.
Сложно, когда на ровном месте возникла ошибка неоднозначности.

Хотя!
Если мы договоримся, что наши функции возвращают не только собственно результат, но и информацию о себе самих.
Примерно так
template<class R, class... Args>
struct augmented_result {
  R value;
};


auto f(short x) -> augmented_result<int, short> { return {123}; }

auto f(auto&& x) -> augmented_result<int, decltype(x)> { return {123}; }

auto f(auto&&... xs) -> augmented_result<int, decltype(xs)...> { return {123}; }

auto f(auto x) {
  if constexpr(...) return augmented_result<int, decltype(x)>{123};
  else              return augmented_result<void, decltype(x)>{};
}

то потом банальное decltype(f(x)) нам даёт информацию о том, какие типы аргументов подошедшая перегрузка действительно ожидает.
И потом мы можем вручную воспроизвести логику выбора наилучшей перегрузки на основе сопоставления формальных и фактических типов.

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