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

标签 c++ c++11 lambda functional-programming

我有一些代码可以通过使用 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/

相关文章:

c++ - "B(int b=0):b(b){}"是什么意思?

c++ - 为什么 C++ 中的这个 lambda 包含每个引用?

java - 是否可以使用 Class::method 语法避免对 Lambda 进行装箱和拆箱? ( java )

c++ - C++ 中 main() 的参数

c++ - 使用 CMake 查找 STC 模块 - C++/wxWidgets

c++ - 为什么要使用 const 进行隐式转换?

multithreading - gcc 支持 unique_locks 吗?

c++ - 这个使用 <locale> 的简单 C++ 程序是否正确?

C++0x : rvalue reference versus non-const lvalue

c# - 使用一个数组中与 C# 中另一个数组中的值匹配的所有值创建一个数组