【发布时间】:2019-04-04 17:26:19
【问题描述】:
如果我将 lambda 作为模板参数传递,那么推导出的参数的实际类型是什么?我查看了 VS2017 调试器和这个 lambda 的类型:[](int x) {return x; } 是 filename::__I2::int<lambda>(int)。
我问这个的原因是因为我想传递一个 lambda,然后从中创建一个内部 std::function。请注意,这与this answer 以及为什么我们必须使用 CTAD 构造内部std::function 而不仅仅是将模板参数传递给std::function 相关。
例如,我想做如下的事情:
template<class Func, class... Args>
void createStdFunc(Func f, Args... args) {
std::function<Func> internalFunc = f; //this does not work
}
//usage
createStdFunc([](int x) {return x; }, 5);
但是,这不起作用,我收到错误'initialising' cannot convert from 'Func' to 'std::function<Func>'。我不确定这些类型有何不同以及它们从传递到函数到初始化std::function 的变化。请注意,我知道您可以从 2017 年开始使用 CTAD,但想知道 2014 年及之前的解决方案是什么?
【问题讨论】:
-
每个 lambda 都有一个唯一的类型,编译器知道,但你不能直接命名自己。但是,它们都可以转换为(正确声明)
std::functions。 -
@JesperJuhl,是的-但我想知道为什么,在上面的示例中,如果
f是一种 Func 那么为什么我不能将 f 分配给 std::function ?我可能理解错了类型。 -
另外,lambda 的类型不是函数类型,它是
std::function的模板参数所必需的。例如您需要createStdFunc<int(int)>([](int x) {return x; }, 5);才能使用int(int)作为Func模板参数,而不是lambda 类型。 -
@DanielSchepler - 是的 - 所以我必须有某种方法从 lambda 中提取类型才能做到这一点?我想知道 CTAD 是如何做到这一点的。
-
您究竟想用
std::function做什么?您同时获得所有参数 - 您是否只想懒惰地绑定它们(例如internalFunc不应该接受任何参数?)还是什么?看到std::function和所有论点对我来说有点奇怪 - 所以我想知道您要解决的实际问题是什么。
标签: c++ lambda c++14 std-function template-argument-deduction