【发布时间】:2021-04-03 14:51:08
【问题描述】:
是否可以获得具有捕获的 lambda 的 lambda 调用运算符的地址?甚至更多:将这样一个指针分配给一个公共指针,该指针可以指向具有相同捕获和相同调用参数的不同 lambda?严格来说,将一个结果 (class1::*)( ... ) 分配给另一个结果 (class2::*)( ... ) 不应该是直接可行的,但是您可能会做一些肮脏的伎俩并强制转换指针,这是可能的,因为 lambda 类在概念上是可互换的。
那么“正确”的语法是什么?即使是一个肮脏的把戏。
不幸的是,以下代码的最后一行不起作用:
int main()
{
int i;
auto l100 = [&]()
{
i += 100;
};
using l100_t = decltype(l100);
using l100_fn = void (l100_t::*)();
l100_fn fn100 = &l100_t::operator ();
}
【问题讨论】:
-
你的意思不是使用
std::function? -
Lambda 是 voldemort 类型。但是在紧要关头可以
using mylambda_t = decltype(mylambda);。 -
"lambda 类在概念上是可互换的。" 什么是完全不相关的类的“可互换”?
-
"具有相同捕获和相同调用参数的不同 lambda?" 听起来您想要一个派生类,而不是 lambda。不要使用 lambdas 作为一种快速而肮脏的方式来编写类型。
-
我从 gcc、clang 和 msvc 那里得到的
l100_fn fn100 = &l100_t::operator ();编译器错误都给出了如何纠正它的重要提示。
标签: c++