Как я могу перегрузить функцию для концепции?

Предположим, у меня есть шаблон функции и различные перегрузки, которые специализируют шаблон. Поскольку перегрузки лучше соответствуют версии шаблона при разрешении перегрузки, они всегда будут иметь приоритет.

template <typename T>
void dispatch(T&& t) {
    std::cout << "generic\n";
}

void dispatch(int) {
    std::cout << "int\n";
}

dispatch(5); // will print "int\n"
dispatch(nullptr); // will print "generic\n";

Теперь у меня есть случай, когда у меня есть специализация, которая может работать для всего набора (несвязанных) типов, которые, однако, удовлетворяют ограничениям из концепции, например:

template <std::floating_point T>
void dispatch(T t) {
    if constexpr(std::is_same_v<T, float>) std::cout << "float\n";
    else std::cout << "unknown\n";
}

К сожалению, эта перегрузка соответствует общему случаю, поэтому вызов типа dispatch(1.0f) неоднозначен. Конечно, я мог бы решить эту проблему, предоставив явные перегрузки для всех типов (известных мне на данный момент), но поскольку количество типов в моем реальном приложении велико (клиенты могут добавить больше типов этой концепции) и код для каждый из этих типов был бы очень похож (вплоть до небольших различий, которые известны во время компиляции), это было бы много повторений.

Есть ли способ перегрузить функцию для всей концепции?


person Jodocus    schedule 12.08.2020    source источник


Ответы (1)


Шаблон функции с ограничениями превосходит шаблон функции без ограничений, только если они имеют одинаковую списки параметров-шаблонов и типы параметров функций. Так что либо заставьте общий принять значение (чтобы оба принимали T):

template <typename T>
void dispatch(T t) {
    std::cout << "generic\n";
}

Или сделайте так, чтобы с плавающей запятой была ссылка на пересылку (чтобы обе принимали T&&):

template <typename T>
    requires std::floating_point<std::remove_cvref_t<T>>
void dispatch(T&& t) {
    if constexpr(std::is_same_v<T, float>) std::cout << "float\n";
    else std::cout << "unknown\n";
}
person Barry    schedule 12.08.2020
comment
Это, конечно, хорошая ловушка. - person Jodocus; 12.08.2020
comment
У них уже есть одинаковые списки параметров шаблона; это типы параметров (функций), которые не совпадают. - person Davis Herring; 03.08.2021