我正在编写一个概念,要求类具有ValueType
类型别名并具有静态函数Check
,该函数接受ValueType
并返回void
。
这是我到目前为止所拥有的:
template <typename T>
concept bool Predicate()
{
return requires(T object)
{
typename T::ValueType;
requires (T::ValueType value)
{
{T::Check(value)} -> void;
};
};
}
这不会编译并显示以下错误:error: expected ')' before 'value'
.
你把问题过度复杂化了:
template <typename T>
concept bool Predicate = requires(typename T::ValueType obj) {
{ T::Check(obj) } -> void;
};
这是我
找到的一个解决方案,它包括将Predicate
拆分为两个单独的概念:
template <typename T>
concept bool HasCheck()
{
return requires (typename T::ValueType value)
{
{T::Check(value)} -> void;
};
};
template <typename T>
concept bool Predicate()
{
return requires(T object)
{
typename T::ValueType;
requires HasCheck<T>();
};
}
魔杖盒示例
或者,您可以使用 &&
链接requires
子句:
template <typename T>
concept bool Predicate()
{
return requires(T object)
{
typename T::ValueType;
}
&& requires (typename T::ValueType value)
{
{T::Check(value)} -> void;
};
}
魔杖盒示例