模板函数可以推导出 lambda 的参数吗?
Can a template function deduce a lambda's arguments?
采用函数指针的模板函数可以像这样推导该函数指针的参数:
template<class... Args>
void func(void (*ptr)(Args&& ...)) {
//Do something useful knowing the Args...
}
你能用 lambda 作为参数做同样的事情吗?
无需诉诸 std::function
或像 function_traits 那样编写元编程特征 class?即仅使用函数推导参数。
不,那不可能。模板参数推导只能推导属于参数类型 "compositionally" 的类型、常量和模板,例如,从 void(*)(Args&&...)
推导 void
和 Args...
,如您的示例,或从 T(&)[N]
推导出 T
和 N
。它无法推断出类型中未出现的任何内容。
对于非多态 lambda 类型 T
,&T::operator()
的类型包含有关 lambda 参数类型的可推导信息。但是 T
本身没有。
采用函数指针的模板函数可以像这样推导该函数指针的参数:
template<class... Args>
void func(void (*ptr)(Args&& ...)) {
//Do something useful knowing the Args...
}
你能用 lambda 作为参数做同样的事情吗?
无需诉诸 std::function
或像 function_traits 那样编写元编程特征 class?即仅使用函数推导参数。
不,那不可能。模板参数推导只能推导属于参数类型 "compositionally" 的类型、常量和模板,例如,从 void(*)(Args&&...)
推导 void
和 Args...
,如您的示例,或从 T(&)[N]
推导出 T
和 N
。它无法推断出类型中未出现的任何内容。
对于非多态 lambda 类型 T
,&T::operator()
的类型包含有关 lambda 参数类型的可推导信息。但是 T
本身没有。