std::result_of
вычисляет возвращаемый тип вызывающего выражения во время компиляции.
Как ссылка говорит, что если вызов плохо сформирован, то в результате создания std::result_of
возникает ошибка компиляции. Но предположим, что нам нужно проверить, правильно ли сформирован вызов, до получения типа результата.
Есть ли способ написать признак, который проверяет правильность формирования вызывающего выражения?
Что-то вроде:
template<typename F , typename... ARGS>
struct is_valid_call : public impl::is_valid_call<F,typelist<ARGS...>>
{};
namespace impl
{
struct sfinae_result{};
template<typename F , typename ARGS , typename ENABLED = sfinae_result>
struct is_valid_call;
template<typename F , typename... ARGS>
struct is_valid_call<F,typelist<ARGS...>,
decltype( std::declval<F>()(std::declval<ARGS>()...) )
> :
public std::true_type
{};
template<typename F , typename... ARGS>
struct is_valid_call<F,typelist<ARGS...>,sfinae_result> :
public std::false_type
{};
}
EDIT: Конечно, решение опубликовано не работает