C++ 模板函数能否推导出λ';谁的论点?

C++ 模板函数能否推导出λ';谁的论点?,c++,lambda,metaprogramming,function-pointers,c++17,C++,Lambda,Metaprogramming,Function Pointers,C++17,采用函数指针的模板函数可以推断该函数指针的参数,如下所示: template<class... Args> void func(void (*ptr)(Args&& ...)) { //Do something useful knowing the Args... } 模板 无效函数(无效(*ptr)(参数和…){ //做一些有用的事情了解Args。。。 } 你能用lambda做同样的论证吗; 不必求助于std::function或像function\u

采用函数指针的模板函数可以推断该函数指针的参数,如下所示:

template<class... Args>
void func(void (*ptr)(Args&& ...)) {
    //Do something useful knowing the Args...
}
模板
无效函数(无效(*ptr)(参数和…){
//做一些有用的事情了解Args。。。
}
你能用lambda做同样的论证吗;
不必求助于
std::function
或像function\u traits那样编写元编程traits类?i、 e.仅使用函数推导参数。

不,这是不可能的。模板参数推断只能推断类型、常量和作为参数类型“组成”部分的模板,例如,从
void(*)推断
void
Args…
(Args&&…
,如您的示例所示,或者从
T(&)[N]
推断
T
N
。它无法推断类型中没有出现的任何内容


对于非多态lambda类型
T
,类型
&T::operator()
包含关于lambda参数类型的可推断信息。但是
T
本身并不如此。

这是否意味着您可以编写类似
decltype(&T::operator())(Args&&…
的内容作为参数来获取lambdas参数,或者严格来说这是不可能的?@Brian是的,如果lambda不是多态的,您可以将
R(T:*)(Args…
作为参数类型并传递
&T::operator()
作为参数。总共需要8个重载来覆盖所有情况,因为lambda的
操作符()
可能是或不是const限定的,可能是或不是
noexcept
,可能有或没有尾部省略号。