Stroustrup给出了在转换操作期间使用重载operator()
在向量元素上执行函数的示例:
class Example
{
public:
std::vector<int> Test1 {1,2,3,4,5};
std::vector<int> Test2;
int operator()(int el);
void MyFunction();
}
int Example::operator()(int el)
{
return el + 1;
}
void Example::MyFunction()
{
std::transform(Test1.begin(), Test1.end(), std::back_inserter(Test2), std::bind(Example(), std::placeholders::_1))
}
然而,随着lambda表达式的引入,上面的代码看起来非常冗长,与之相比:
std::transform(Test1.begin(), Test1.end(), std::back_inserter(Test2), [](int el){return el + 1;});
我是否正确地说使用重载operator()
方法没什么价值?或者是否仍然存在使用STL算法时可能有益的情况?
答案 0 :(得分:2)
是的,你是对的。
lambda表达式基本上创建了一个无名仿函数。它只允许程序员用更少的代码完成它。在C ++ 11之前,标准算法只能用于编程器,这需要程序员为某些特定行为设置一个全新的类(就像你刚才那样)。
这正是为什么将lambda引入C ++ 11的原因,以确保使用带有自定义函子的标准算法不再那么难以写。
答案 1 :(得分:0)
正如Gill Bates所提到的,你是对的,lambda表达式确实创造了一个无名的函子。但是,它也会使代码更难以阅读。我发现,在协作项目中,如果多次使用某些东西,就会更加清楚地重载操作符,特别是如果发生了复杂的事情。
在这方面,如果你谨慎使用lambdas,那就很好。对于至关重要且经常与对象一起使用的功能,您可能希望将所有此类交互封装在重载运算符中。