想象一下 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 吗?)
无论如何,必须指定谓词接受的类型有时会是一种负担。
有没有一种方法可以实现这样一个概念,即对于采用一个或多个任何类型参数但未明确指定类型的函数对象返回true
?
最佳答案
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
,这就是概念的用途。
关于c++ - 用 C++ 概念 TS 描述谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41418506/