我想得到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,那是可能的.
| 归档时间: |
|
| 查看次数: |
575 次 |
| 最近记录: |