LINUX.ORG.RU

История изменений

Исправление 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) };
}

но, повторюсь, это полная чушь, и смысла никакого не имеет.