如何在pre-lambda编译器中处理lambdas

LiK*_*Kao 5 c++ lambda functional-programming c++11

我有一些代码可以通过使用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(...) );
}
Run Code Online (Sandbox Code Playgroud)

我非常习惯这种模式,虽然我不喜欢它.不定义类的主要原因通常是我将在STL中使用仿函数,模板不喜欢函数内联定义的结构.但是在我的情况下,use_functor()函数将是一个普通的方法,所以我可以在函数内部定义函子(每个函子只在一个函数中使用).

void function() {
   struct functor{
      functor( type & member ) : m_member( member ) {}
      void operator()( ... ) {...}
      type & m_member;
   };
   use_functor( functor(...) );
}
Run Code Online (Sandbox Code Playgroud)

这似乎有所改善,但仍然需要更多丑陋的代码,我想要.例如,我想完全摆脱仿函数的名称.我知道如果我只使用一个值,就可以创建一个匿名结构.

void function() {
   struct{
      // functor( type member ) : m_member( member ) {}
      void operator()( ... ) {...}
      // type & m_member;
   } callback ;
   use_functor( callback );
}
Run Code Online (Sandbox Code Playgroud)

但是在这一点上,我不知道如何提供必要的数据成员.由于结构是匿名的,因此它没有构造函数.我可以很容易地设置成员,因为它是公开的,但这又会增加一条我不喜欢的行.

我们的目标是让它处于一种状态,一旦我们切换到具有干净lambda的编译器,就可以尽可能少地改变它,这将允许完全消除这个问题.

你会怎么做呢?

Fle*_*exo 1

关于在没有构造函数的情况下初始化匿名成员变量,struct您可以执行以下操作:

void function() {
   type the_thing;
   struct {
      void operator()( ... ) {...}
      type & m_member;
   } callback = {the_thing};
   use_functor( callback );
}
Run Code Online (Sandbox Code Playgroud)

在 中设置type &参考。m_membercallback