当传递给模板函数时,自动衰减lambda到函数指针
automatic decay of lambda to function pointer when passing to template function
是否有一种方法可以使lambda衰减到指针,而无需显式转换到正确的签名?这将整理一些代码:
template<typename T> T call(T(*func)()){ return func(); }
int ptr(){ return 0; }
int main(){
auto ret1 = call(ptr);
auto ret2 = call((int(*)())([]{ return 0; }));
auto ret3 = call([]{ return 0; }); //won't compile
}
很明显,只有当lambda衰减为指针时,对call
的调用才有效,但我猜只有在选择正确的函数重载/模板后才能发生这种情况。不幸的是,我只能想到涉及模板的解决方案,使lambda 具有任何签名衰减,所以我又回到了起点。
您可以将lambda更改为使用一元+
运算符:+[]{ return 0; }
这可以工作,因为一元加号可以应用于指针,并将触发隐式转换为函数指针。
为什么要不必要地约束自己使用没有默认参数的函数指针和没有捕获的lambda,完全排除大量的函子(例如std::function
, std::bind
的任何结果以及其他具有合适operator()
的所有内容)?
最好拓宽你的函数签名:
template <typename F>
auto call(F func) -> decltype(func()) {
return func();
}
int ptr() { return 0; }
int g(int i = 0) {return i;}
int main() {
auto ret1 = call(ptr);
auto ret2 = call((int(*)())([]{ return 0; })); //tedious, but works
auto ret3 = call([]{ return 0; }); //ok now.
auto ret4 = call(g); //ok now!
int i = 42;
auto ret5 = call([=]{return i;}); //works, too!
auto ret6 = call(std::bind(g, i)); //and so on...
}
作为一个TL;实现@Simple的建议,我写了一个简单的测试如下:
SCENARIO("decay_equiv", "")
{
auto callback = +[](struct mosquitto *, void *,
const struct mosquitto_message *)->void{};
typedef typename std::is_same<
typename std::decay<decltype(callback)>::type,
typename std::decay<void (*)(struct mosquitto *, void *, const struct mosquitto_message *)>::type
>::type s;
std::cout << s::value << std::endl;
}
试着在回调定义中删除+
,一切都停止工作。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么这些函数不衰减到函数指针?
- 如果一个函数通过引用返回一个数组,它是指针的衰减吗?
- 如何在 constexpr 函数中强制编译错误,而不是让它衰减到非 constexpr 上下文中?
- 推断衰减到函数指针的 lambda 类型
- 为什么在模板函数中数组衰减为指针?
- 如果通过模板函数中的 const 引用传递,数组不会衰减到指针
- 可变/非可变模板之间函数类型衰减的不一致性
- 衰减lambda指向的函数存储在哪里?它是如何被释放的
- 衰减调用方方法中的多个函数
- 当传递给模板函数时,自动衰减lambda到函数指针