如何获取c ++ 0x lambda表达式的类型?

jrr*_*ry7 4 c++ lambda c++11

我想得到lambda的类型作为模板参数.这该怎么做?

template<class T>
class Foo
{
public:
    Foo(T t){ t(); }
};

int main()
{   
    Foo< type?? > foo([](){ cout<<"construct OK"; });

    system("pause");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*itb 10

当它是推导出类型的函数模板函数参数的参数时,可以推导出lambda表达式的类型.

然而,Lambda表达式被明确禁止出现在未评估的操作数内 - 这包括decltype.结果发现,这包括几个尚未处理的特殊情况,并且发现在内部decltype和朋友中不允许使用lambda表达式.回想一下,每个lambda表达式都会创建一个新的唯一类型.

您可以使用std::function<void()>,它可以存储任何可以在没有参数的情况下调用的函数对象,并将其void作为返回类型.

Foo< std::function<void()> > foo([](){ cout<<"construct OK"; });
Run Code Online (Sandbox Code Playgroud)

当然,正如我上面所说,函数模板可以推导出它们的参数类型,因此您也可以将构造函数作为模板

class Foo
{
public:
    template<typename T>
    Foo(T t){ t(); }
};

Foo foo([](){ cout<<"construct OK"; });
Run Code Online (Sandbox Code Playgroud)

但是我认为这在你的情况下并不是很有用,因为你可能想要T在你的类定义中做一些事情.比如,将对象存储为非静态数据成员.有了std::function,那是可能的.