Lambda表达式可以降级为C++98吗
Can Lambda expression be downgraded to C++ 98
我最近遇到了一个问题,需要将用lambda表达式编写的C++11代码集成到只支持C++98编译器的旧代码库中。我找到了lambda的两个可能等价物,比如Macro、functor或函数指针。但在使用捕获转换lambda时,它们似乎都受到了限制。例如,一个带有回调的简单通用函数:
template <class Fn>
void ForEachObject(Fn fn)
{
for (uint i = 0; i < objectCount; i++)
{
fn(i, address + i * objectSize);
}
}
典型的呼叫者会做一些类似的事情:
uint attributes = 0x0030;
....
ForEachObject([=](uint index, void * objectAddress)
{
if ((ObjectInfo(index) & attributes) != 0)
{
fn(index, objectAddress);
}
});
注意,这里的属性来自lambda的范围之外。是否仍然可以在没有lambda的情况下重用for each逻辑?或者我必须重写每一个这样的调用者的逻辑?
带函数:
struct Functor
{
explicit Functor(uint attributes) : attributes(attributes) {}
void operator () (uint index, void * objectAddress) const
{
if ((ObjectInfo(index) & attributes) != 0)
{
fn(index, objectAddress);
}
}
uint attributes;
};
然后打电话给
uint attributes = 0x0030;
// ....
ForEachObject(Functor(attributes));
对于每个不同的lambda,您必须编写一个函子。您不必修改ForEachObject
Lamda表达式可以降级为C++98 吗
不,他们不能。以前的C++11标准没有lambda语法的概念。
尽管有类似boost::lambda
的替代品可用
您可以提供函子样式的类,覆盖调用运算符(<return_type> operator()(<args>);
),以提供与另一个答案中提到的效果相同的效果。
相关文章:
- C++ C++类中的命名空间降级
- C++98,但叮叮当当地说使用nullptr?
- C ++枚举范围无法使用-std=c ++ 98进行编译,但使用-std=c ++ 11可以
- 如何在Visual Studio 2019中启用C++98编译?
- 使用 C++98 标准填充二维静态向量
- 作为参数模板的模板类:MSVC 错误 - 错误 C2977:模板参数过多 (C++98)
- 如何将要求降级到动态库的 glibcxx 3.4.20?
- 我正在使用dev c ++,但收到错误(C++98'array'必须由构造函数初始化)
- C++98中的浮点比较
- C++父指针降级为用作函数参数的子指针
- 在 C++98/03 中以相反的顺序将 C 数组附加到向量,而无需 for 循环
- 如何在 c++98 中通过特定字段在 QList 中查找对象?
- 连接来自 C++98 接口的 Qt 插槽和信号,无需 Qt、STL 或 Boost
- C++ 98 阵列大小
- 是否可以在 OpenSUSE 上降级 glibc?
- 如何强制Qt QMake项目使用C++98标准?
- 如何处理C++98中不同类型的多个参数?
- 在 C++98 中,'dvd1' 必须由构造函数初始化,而不是由 '{...}' 初始化
- 优化 C++ 98 中载体的滤波
- Lambda表达式可以降级为C++98吗