我有一些代码,如果使用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 的编译器后尽可能少地更改状态,从而消除这个问题。
你会如何处理这个问题?