我有一些代码可以通过使用 lambda 大大降低复杂性。然而不幸的是,我们不得不使用一个不完全支持 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 );
}
在回调
中设置类型&
引用m_member
。
关于c++ - 如何在 pre-lambda 编译器中处理 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7993674/