我有一些代码,可以大大的复杂性,通过使用lambda表达式减少。然而不幸的是,我们必须使用不完全支持C++ 11的编译器,我们不能轻松切换。现在的问题是如何保持逻辑尽可能接近与不可用的功能的λ表达(即std::function
是可用的,lambda表达式都没有)。如何处理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表达式,这将允许完全消除这一问题的编译器。
你怎么会去这样做呢?
当我刚发现,一些老的GCC的甚至不处理来自嵌套函数到std ::功能<>很好的结构转换,而不会像任何的解决方案。所以我不得不使用选项一并分开逻辑。 – LiKao