从lambda函数推导出std::函数的类型T

deducting a type T for std::function from a lambda function

本文关键字:函数 类型 std lambda      更新时间:2023-10-16

我想了解下面的代码是如何工作的:

#include <iostream>
#include <functional>
using namespace std;
template <typename T> struct Identity
{
    typedef T type;
};
template <typename T> void foo(T val, typename Identity<function<void(T)>>::type f)
{
    f(val);
}
int main ()
{
    foo(1337,[](int x){ cout << "lambda " << x << endl; });
    return 0;
}

没有选择T使lambda类型等于std::function(void(T))类型,所以这就是需要元函数的原因。

我知道嵌套名称说明符::是一堵砖墙,这样编译器就不会试图为该参数推断类型T

所以我尝试了相同的代码,但没有T val函数参数和T无法推断。

这是否意味着当你调用 时,编译器会执行以下步骤?

foo(1337,[](int x){ cout << "lambda " << x << endl; });

  1. 参数为1337,参数为T val//T被扣除为int
  2. 砖墙,不会尝试从第二个参数
  3. 推断类型

编译器现在会使用从步骤1中扣除的T类型调用Identity<function<void(int)>>吗?还是会做其他事情?

是的,我相信你是对的。

不幸的是,标准中用于模板参数推导的语言是如此令人难以置信的冗长,我甚至不敢开始尝试证明这是一个事实。