【发布时间】: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