用 C++ 概念 TS 描述谓词
Describing Predicate with C++ Concepts TS
想象一下 std::all_of
在未来的 C++ 标准中的实现:
// constraining InputIt doesn't concern this question
template<typename InputIt, typename Pred>
bool all_of(InputIt first, InputIt last, Pred pred)
requires Predicate<Pred, decltype(*first)>()
// requires Predicate<Pred>() // this would accept any, would like this
{
for (; first != last; ++first)
if (!pred(*first))
return false;
return true;
}
其中概念Predicate
定义为:
template<typename Pred, typename Param>
concept bool Predicate()
{
return requires(Pred p, Param a) {
{ p(a) } -> bool;
};
}
这显然符合预期。 (还有当函数对象有默认参数时,但从技术上讲这不仍然是一个 UnaryPredicate 吗?)
无论如何,必须指定谓词接受的类型有时会是一个负担。
有没有一种方法可以实现这样一个概念,即 return true
函数对象采用一个或多个 any 类型的参数,其中类型没有明确规定?
Is there a way to implement such a concept which would return true for function objects taking one or more parameters of any type where the type isn't explicitly specified?
我认为没有合理的表达方式。也许通过反射提议,可以检查函数对象是否仅接受 auto
或等效的普通模板参数 T
.
的参数
关于:
// requires Predicate<Pred>() // this would accept any, would like this
概念测试类型的属性,因此您实际上需要指定参数类型 A
,类型 P
应满足 Predicate<P,A>()
。如果您可以在不指定 A
的情况下执行此操作,则 Predicate
无法检查 P
和 A
之间的指定约束,这就是概念的用途。
想象一下 std::all_of
在未来的 C++ 标准中的实现:
// constraining InputIt doesn't concern this question
template<typename InputIt, typename Pred>
bool all_of(InputIt first, InputIt last, Pred pred)
requires Predicate<Pred, decltype(*first)>()
// requires Predicate<Pred>() // this would accept any, would like this
{
for (; first != last; ++first)
if (!pred(*first))
return false;
return true;
}
其中概念Predicate
定义为:
template<typename Pred, typename Param>
concept bool Predicate()
{
return requires(Pred p, Param a) {
{ p(a) } -> bool;
};
}
这显然符合预期。 (还有当函数对象有默认参数时,但从技术上讲这不仍然是一个 UnaryPredicate 吗?)
无论如何,必须指定谓词接受的类型有时会是一个负担。
有没有一种方法可以实现这样一个概念,即 return true
函数对象采用一个或多个 any 类型的参数,其中类型没有明确规定?
Is there a way to implement such a concept which would return true for function objects taking one or more parameters of any type where the type isn't explicitly specified?
我认为没有合理的表达方式。也许通过反射提议,可以检查函数对象是否仅接受 auto
或等效的普通模板参数 T
.
关于:
// requires Predicate<Pred>() // this would accept any, would like this
概念测试类型的属性,因此您实际上需要指定参数类型 A
,类型 P
应满足 Predicate<P,A>()
。如果您可以在不指定 A
的情况下执行此操作,则 Predicate
无法检查 P
和 A
之间的指定约束,这就是概念的用途。