我正在尝试使用新概念语法为自己制作一个简单的示例。我决定测试一个类型是否定义了 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;
,
但我收到了与名称相关的类型错误。添加类型名后,我现在收到
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>()), ...
替换第一次检查的 decltype 调用中的第一项(对于二进制运算符),但我很难理解它是如何转换为函数调用的。(从上到下的第三个答案,供参考:如何检查 operator== 是否存在?)。