如何在pre-lambda编译器中处理lambda
How to handle lambdas in a pre-lambda compiler
我有一些代码可以通过使用lambdas大大降低复杂性。然而,不幸的是,我们必须使用不完全支持c++ 11的编译器,而且我们不能轻易切换。现在的问题是如何保持逻辑尽可能接近lambda表达式的功能不可用(即std::function
是可用的,lambda不是)。
struct functor{
functor( type & member ) : m_member( member ) {}
void operator()( ... ) {...}
type & m_member;
};
void function() {
use_functor( functor(...) );
}
我非常习惯这种模式,尽管我很不喜欢它。不定义类的主要原因通常是函数函数将在STL中使用,而模板不喜欢内联定义函数的结构体。然而,在我的例子中,use_functor()
函数将是一个普通方法,因此我可以在函数本身内部定义函子(每个函子仅在一个函数中使用)。
void function() {
struct functor{
functor( type & member ) : m_member( member ) {}
void operator()( ... ) {...}
type & m_member;
};
use_functor( functor(...) );
}
这似乎有所改进,但仍然需要更多我想要的丑陋代码。比如,我想把函子的名字都去掉。我知道创建一个匿名结构是可能的,如果我只使用一个值。
void function() {
struct{
// functor( type member ) : m_member( member ) {}
void operator()( ... ) {...}
// type & m_member;
} callback ;
use_functor( callback );
}
但是,在这一点上,我不知道如何提供必要的数据成员。因为结构是匿名的,所以它没有构造函数。我可以很容易地设置成员,因为它是公共的,但这又会增加我不喜欢的一行。
我们的目标是让它处于一种状态,一旦我们切换到一个具有干净lambda的编译器,就可以尽可能少地改变它,从而完全消除这个问题。
你会怎么做呢?
对于没有构造函数的匿名struct
的成员变量的初始化,您可以这样做:
void function() {
type the_thing;
struct {
void operator()( ... ) {...}
type & m_member;
} callback = {the_thing};
use_functor( callback );
}
在callback
中设置type &
引用m_member
。
您可以尝试boost lambda库或boost::phoenix。它们都被设计为在没有实际lambda支持的情况下执行lambda风格的操作。因为它们是基于模板的,所以当某些错误不像预期的那样工作时,错误可能很难调试。
对woodland的答案进行扩展:
#define MY_LAMBDA(name, memberType, memberValue, body)
struct {
void operator()( ... ) body
memberType & memberValue;
} name = {memberValue}
void function() {
type thing_to_capture;
MY_LAMBDA(callback, type, thing_to_capture
{
std::cout << thing_to_capture << std::endl;
});
use_functor( callback );
}
可以在任何可以定义结构体的地方使用MY_LAMBDA
。不幸的是,如果没有可变宏,您必须将所有捕获的对象包装成单个对象,并且必须在"lambda声明"
还要注意,使用lambda的等效值为:
void function() {
type thing_to_capture;
auto callback = [&thing_to_capture]()
{
std::cout << thing_to_capture << std::endl;
};
use_functor( callback );
}
相关文章:
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 处理多个异常集合的C++方法
- Visual C++: MSVC vs. GCC+CLANG: 处理 lambda 捕获类成员变量,正确的方法是什么?
- 容器如何处理 lambda 表达式的参数
- 当使用lambda进行变量的复杂初始化时,如何处理从内部抛出的lambda外部异常
- 我可以让返回类型自动处理具有相同签名但捕获不同内容的 lambda 吗?
- 如何避免使用 lambda 进行代码重复的常量和非常量集合处理
- 解除 lambda 事件处理程序的绑定
- 处理重构、模板 SFINAE 测试和 lambda
- 编译器如何以不同于常规函数的方式处理 lambda?
- 使用Auto和Lambda处理信号
- C++ 如何处理循环中使用的 lambda 表达式for_each返回值
- 在c++ lambda表达式中调用类成员函数失败.处理步骤
- 如何在pre-lambda编译器中处理lambda
- 为什么成员函数尝试块处理程序中的 lambda(捕获"this")无法访问 VC++ 2013 中的私有数据成员?
- Boost Lambda/Phoenix-如何处理返回另一个Lambda的Lambda
- 使用 lambda 函数处理 C++ libsigc++ 信号
- 如何使用lambda来boost异步完成处理程序