为什么有一个本地的仿函数是不好的?

aCu*_*ria 7 c++ visual-studio-2010

例如,如果谓词只使用一次,那么在main函数中声明类倍增器有什么问题?

#include <list>
#include <algorithm>
#define SIZE 10
int main()
{
    std::list<int> myList;
    for(int i=0; i<SIZE ;++i)
    {
        myList.push_back(i);
    }

    class doubler
    {
    public:
        doubler(){}
        int operator()(int a)
        {
            return a + a;
        }

    } pred;

    std::for_each(myList.begin(), myList.end(), pred);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

tem*_*def 14

这种设置的问题是,至少在C++ 03中,您不能使用本地仿函数作为模板参数,因为它没有外部链接.这意味着从技术上讲,上述代码不合法​​.但是,他们正在用C++ 0x修复它,因为它是一个非常愚蠢的限制,并且由于VS2010具有基本的C++ 0x支持,上面的代码完全没问题.

简而言之,您的问题的答案是,如果您使用符合C++ 0x的编译器,那么它没有任何问题,但是否则您应该避免这样做以最大化交叉编译器兼容性.

  • 好吧,如果你使用VS2010,你可以直接使用lambda函数.for_each(myList.begin(),myList.end(),[](int val){return val + val;}); (2认同)

Kon*_*lph 5

  • 在C++ 0x之前它是非法的
  • 在C++ 0x中,有一个更好的解决方案(lambdas/closures)

所以在任何一种情况下你应该使用不同的解决方案