Я пытаюсь сделать простой пример для себя, используя новый синтаксис концепции.Я решил проверить, определен ли для типа оператор operator (), и создал структуру для проверки этого с использованием парадигмы SFINAE, но я сталкиваюсь с проблемами типов.Вот мой код:
#include <utility>
#include <functional>
namespace Templates::Concepts {
template<class type__>
struct call_check {
template<class type_ = type__>
static auto check(std::nullptr_t) -> decltype(std::declval<type_>().operator()(), std::false_type(), std::true_type());
template<class type_ = type__>
static auto check(...) -> decltype(std::false_type());
template<class type_ = type__>
using type = decltype(check<type_>(nullptr));
};
template<typename type_>
concept bool Callable = []() -> bool { typename call_check<type_>::type *t; return *t;};
}
Я запустил без указателя 'typename', и у меня было
return call_check<type_>::type;
,
, но я получил ошибки в зависимости от имени типа,После добавления typename я теперь получаю
concepts.h:20:78: error: ‘typename Templates::Concepts::call_check<yes>::type’ names ‘template<class type_> using type = decltype (check<type_>(nullptr))’, which is not a type
,
, и я застрял.Честно говоря, я не совсем уверен, что самый правильный способ - реализовать эту проверку SFINAE, поэтому я не уверен, с чего начать.Любая помощь с парадигмой и / или концепциями также будет оценена.
Я видел пример с чем-то вроде
std::declval<type_>()(std::declval<other>(), std::declval<op>()), ...
, заменяющим первыйitem в вызове decltype первой проверки (для бинарных операторов), но мне было трудно понять, как это переводится в вызов функции.(Третий ответ сверху, для справки: Как проверить, существует ли оператор ==? ).