从lambda函数推导出std::函数的类型T
deducting a type T for std::function from a lambda function
我想了解下面的代码是如何工作的:
#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; });
- 参数为1337,参数为
T val
//T被扣除为int - 砖墙,不会尝试从第二个参数 推断类型
编译器现在会使用从步骤1中扣除的T
类型调用Identity<function<void(int)>>
吗?还是会做其他事情?
是的,我相信你是对的。
不幸的是,标准中用于模板参数推导的语言是如此令人难以置信的冗长,我甚至不敢开始尝试证明这是一个事实。
相关文章:
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 是否有任何建议来统一函数类型限定符并简化可恶的函数类型?
- 关于 C++ 中的函数类型定义
- 用于检测函数类型是否为否的特征
- 函数类型参数的模板参数推导
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- C++无效的函数类型转换
- STL 函数和函数类型与函数指针类型
- 如何将result_of与函数类型定义一起使用
- 将模板(没有规范)传递给 std::thread() 会出现错误:<未解析的重载函数类型>匹配错误
- C++ 编译错误:gnu_printf是无法识别的格式函数类型
- 专门用于"direct"函数类型(与函数指针类型相对)
- 将函数类型作为模板参数传递不会编译
- 通过参数传递 lambda(无函数类型模板)
- 如何在模板参数中分离函数类型返回类型和参数
- 为什么比较函数类型需要指定为模板参数?
- 带有限定符的函数类型定义用例
- 如何声明对函数类型的常量引用
- 非类型模板参数允许各种函数类型?