Lambda表达式可以降级到C++ 98吗
Can Lambda expression be downgraded to C++ 98
我最近遇到一个问题,需要将使用 lambda 表达式编写的 C++ 11 代码集成到仅支持 C++ 98 编译器的旧代码库中。我想出了几个可能的 lambda 等价物,比如宏、函子或函数指针。但是在用捕获翻译 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 的情况下重用每个逻辑?或者我必须为每个这样的调用者重写逻辑?
与函子:
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
Can Lamda expression be downgrade to C++ 98
不,他们不能。之前的 C++11 标准没有 lambda 语法的概念。
虽然有像 boost::lambda
这样的替代品
您可以提供 仿函数样式 类,覆盖调用运算符 (<return_type> operator()(<args>);
),以提供相同的效果,如其他答案中所述.
我最近遇到一个问题,需要将使用 lambda 表达式编写的 C++ 11 代码集成到仅支持 C++ 98 编译器的旧代码库中。我想出了几个可能的 lambda 等价物,比如宏、函子或函数指针。但是在用捕获翻译 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 的情况下重用每个逻辑?或者我必须为每个这样的调用者重写逻辑?
与函子:
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
Can Lamda expression be downgrade to C++ 98
不,他们不能。之前的 C++11 标准没有 lambda 语法的概念。
虽然有像 boost::lambda
您可以提供 仿函数样式 类,覆盖调用运算符 (<return_type> operator()(<args>);
),以提供相同的效果,如其他答案中所述.