Как проверить подписанный тип возврата?

Представьте, что у меня есть вызываемый шаблон-параметр «Fn fn». Теперь я хочу проверить, что возвращаемый тип является скаляром со знаком . Как я могу сделать это с концепциями С++20?

1 ответ

Чтобы проверить, можно ли его вызвать и вернуть что-то из категории, просто вызовите его и проверьте выражение. В конце концов, это и есть концепты, инструмент для написания обычного кода на C++ и изучения некоторых его свойств.

      template<typename T>
concept signed_scalar = std::signed_integral<T> || std::floating_point<T>;

template<typename Fn, typename... Args>
concept signed_result = requires(Fn fn, Args... args) {
    { fn(args...) } -> signed_scalar;
};

Это единственный общий способ, учитывая, что перегрузка всегда возможна в любой программе на C++, в том числе и в функторах. operator().

Вы также можете проявить фантазию и использовать std::invokeвместо простого выражения вызова функции для обработки более «вызываемых» типов. Но вы не указали, что это требование.

Другие вопросы по тегам