C++ C++;20 std::invocable语法

C++ C++;20 std::invocable语法,c++,c++20,C++,C++20,我想写这个 template <typename F, typename... Args> requires std::invocable<F&, Args...> void applyFunction(F&& f, Args&&... args) { } …但它无法编译。我搜索了StackOverflow,但找不到如何使用正确的语法。 如何正确使用简洁的语法 更新:我发现这是可行的: templ

我想写这个

    template <typename F, typename... Args> requires std::invocable<F&, Args...>
    void applyFunction(F&& f, Args&&... args) {

    }
…但它无法编译。我搜索了StackOverflow,但找不到如何使用正确的语法。 如何正确使用简洁的语法

更新:我发现这是可行的:

    template <typename... Args, std::invocable<Args...> F>
    void applyFunction(F&& f, Args&&... args) {

    }
模板
void applyFunction(F&&F,Args&&…Args){
}

还是很丑。有更好的方法吗?

在模板参数列表中使用概念代替
typename
,只有在替换概念的一个模板参数时才有效。具体来说,第一个

如果您有两个(或更多)共享关系的模板参数,则很可能需要一个
requires
子句。你需要平静下来。实际上,将参数包放在函数前面,就像您在模板参数列表中所做的那样,会产生一些后果。用户在调用函数时几乎不可能直接指定可调用类型参数,因此用户将被迫依赖模板参数推断


不要仅仅因为只需少敲几下键盘就强迫语法工作。用对你所做的事情最有意义的方式来写,这样就可以最清楚地知道发生了什么。

错误是什么?如果你在线搜索错误会怎么样?@UlrichEckhardt这是我能找到的最接近的,但是这种语法只允许使用固定数量的函数参数,而不是可变数量的参数。“without requires子句”为什么这么重要?使用
requires
子句是可以的。是的,它可以毫无问题地工作,但是人们可以说“谁需要
概念
s?如果
均衡,那么
std::enable\u有什么问题吗?反正它工作得很好”。。我想写一个更干净、更短、更简洁的代码。@frozenca:“那么人们可以说”std::enable\u if\t Equiremistics有什么问题?不管怎样,它工作得很好“任何一个”说这都是错误的,因为使用
enable\u if
体操有几个重大问题。概念的发明不仅仅是因为
enable\u if
很冗长。
    template <typename... Args, std::invocable<Args...> F>
    void applyFunction(F&& f, Args&&... args) {

    }