【问题标题】:Passing a lambda to a virtual function将 lambda 传递给虚函数
【发布时间】:2022-01-13 23:33:11
【问题描述】:

通常将 lambda 仿函数传递给方法的习惯用法依赖于模板化参数:

template<typename Functor>
void apply(Functor f)
{
   f(stuff);
}

但是,C++ 语言不支持虚拟声明的模板参数。特此问题:没有简洁的方法来定义处理某些 lambda 的虚拟接口:

virtual void apply(Lambda???) = 0;

也许有一种方法:将 lambda 转换为重量级 std::function 并使用它

除了那个之外,还有其他方法可以将 lambda 传递给虚拟方法吗?

我想也许可以通过在类型类中将函子声明为类型参数来绕过限制:

template<typename SomeArgs, typename Functor>
struct interface
{
    virtual void apply(Functor&& f) = 0;
};

但是 lambdas 不一定是类型兼容的,即使它们具有相同的签名,所以这实际上除了我之外什么都不是。也许std::function 是唯一的方法?

【问题讨论】:

  • std::function 的存在表明存在一种方法(因为创建后它并不关心您是否为其分配了函数指针或 lambda)。但这并不容易

标签: c++ lambda virtual-functions


【解决方案1】:

是的,您必须执行与std::function 等效的操作。原因是您正在调用的虚函数可能在其他翻译单元中定义,因此它不可能适应您的 lambda 可能具有的任何隐式转换或默认参数。它所能做的就是调用一个众所周知的虚函数本身(通过std::function&lt;…&gt;::operator()),你定义它来调用你的lambda。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多