История изменений
Исправление Siborgium, (текущая версия) :
Да, и requires молча убирает функцию из overload set в случае, если она не удовлетворяет предикату. Т.е. какой-то ошибки у вас не будет, только длинный контекст трейс в случае если другого подходящего варианта не найдется.
Можно сделать, например, так
template <typename F>
void foo(F && f) {
static_assert(invocable_as<F, RetType, ArgType1, ArgType2>);
ArgType1 arg1;
ArgType2 arg2;
RetType var{ f(arg1, arg2) };
}
и оно будет работать так, как вы хотите, но, повторюсь, все это полная чушь, и смысла никакого не имеет. Проблема абсолютно надумана и буквально не существует. Если вас волнуют неявные преобразования, пишите свои врапперы.
enum class Int: int { };
Int operator + (Int x, Int y) {
return static_cast<Int>(static_cast<int>(x) + static_cast<int>(y));
}
Исходная версия Siborgium, :
Да, и requires молча убирает функцию из overload set в случае, если она не удовлетворяет предикату. Т.е. какой-то ошибки у вас не будет, только длинный контекст трейс в случае если другого подходящего варианта не найдется.
Можно сделать, например, так
template <typename F>
void foo(F && f) {
static_assert(invocable_as<F, RetType, ArgType1, ArgType2>);
ArgType1 arg1;
ArgType2 arg2;
RetType var{ f(arg1, arg2) };
}
но, повторюсь, это полная чушь, и смысла никакого не имеет.