我正在编写一个概念,要求类具有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'
。
答案 0 :(得分:4)
这是我找到的一个解决方案,其中包括将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;
};
}
答案 1 :(得分:4)
你过度卷曲了这个问题:
template <typename T>
concept bool Predicate = requires(typename T::ValueType obj) {
{ T::Check(obj) } -> void;
};