你的前提有点负荷。虽然可能通过引入概念来转换模板的旧语法(对于函数、类、变量或别名模板都一样),但在许多情况下,这样做是人为的并且传递了接力棒。以经典的std::transform函数模板为例:
// current
template<typename In, typename Out, typename Func>
Out transform(In first, In last, Out out, Func func);
您可以将其转换为以非常明显的方式使用概念介绍:
TransformParameters{In, Out, Func}
Out transform(In first, In last, Out out, Func func);
正如您所说,这是相当机械的,而且毫无意义:TransformParameters 伪概念在其他任何地方可重用的可能性有多大,它对程序员有什么帮助?此声明将为您提供no旧信息的新信息。我承认,假设这个伪概念编写正确,程序员应该受益于改进的诊断/重载解决方案。
相反,我希望std::transform 的合理、支持概念的声明看起来像这样(因为我们没有标准概念,但我在这里使用虚构的概念和特征,重点关注原则):
template<Iterator In, Iterator Out, Value Func>
requires
Callable<Func, iterator_reference_t<In>>
&& AssignableFrom<
iterator_reference_t<Out>,
result_of_t<Func(iterator_reference_t<In>)>
>
Out transform(In first, In last, Out out, Func func);
要求的想法反映了std::transform 具有关联表达式*out = func(*in) 的事实。此外,出现在 requires 子句中的元素当然是可重用的(迭代器引用类型和 std::result_of_t 确实已经在使用中)。
这个相对简单的例子说明了为什么概念介绍根本不会在任何地方都起作用。一些require元素涉及我想称之为第三方类型,即iterator_reference_t<…>和result_of_t<…>,而一些输入类型同时涉及多个关系(例如It出现在Iterator和@987654334中@)。
否则,即当所有参数类型之间只有一种关系并且只有它们之间存在一种关系时,并且该关系是否可以合理地表达意图并且最好是可重用的;那么概念介绍可能会占有一席之地。 (不过,一个带有概念介绍的缩写模板进一步拓宽了这个应用领域。)