想象一下在未来的C ++标准中实现std::all_of
:
// 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
,其中任何类型的一个或多个参数未明确指定类型?
答案 0 :(得分:2)
有没有办法实现这样一个概念,这个概念对于函数对象返回true,它接受任何类型的一个或多个参数,其中未明确指定类型?
我认为没有合理的方式来表达这一点。也许使用反射建议,可以检查函数对象是否只接受auto
或等效的普通模板参数T
的参数。
关于:
// requires Predicate<Pred>() // this would accept any, would like this
概念测试类型的属性,因此您实际需要指定类型A
应满足P
的参数类型Predicate<P,A>()
。如果您可以在未指定A
的情况下执行此操作,则Predicate
无法检查P
和A
之间的指定约束,这就是概念的用途。