Как проверить подписанный тип возврата?
Представьте, что у меня есть вызываемый шаблон-параметр «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
вместо простого выражения вызова функции для обработки более «вызываемых» типов. Но вы не указали, что это требование.