如何在函数内定义仿函数

时间:2011-07-30 14:50:19

标签: c++

有时,我需要一些functor-helper来操作列表。我尽量将范围保持在本地。

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    struct Square
    {
        int operator()(int x)
        {
            return x*x;
        }
    };

    int a[5] = {0, 1, 2, 3, 4};
    int b[5];

    transform(a, a+5, b, Square());

    for(int i=0; i<5; i++)
        cout<<a[i]<<" "<<b[i]<<endl;
}

hello.cpp: In function ‘int main()’:
hello.cpp:18:34: error: no matching function for call to ‘transform(int [5], int*, int [5], main()::Square)’

如果我将Square移出main(),那就没关系。

4 个答案:

答案 0 :(得分:6)

你不能这样做。但是,在某些情况下,您可以使用boost::bindboost::lambda库来构建仿函数,而无需声明外部结构。此外,如果你有一个最新的编译器(如gcc版本4.5),你可以启用新的C ++ 0x功能,允许你使用lambda表达式,允许这样的语法:

transform(a, a+5, b, [](int x) -> int { return x*x; });

答案 1 :(得分:6)

在当前标准(C ++ 98/03)中,本地类(本地仿函数)不能用作类作为模板参数。

答案 2 :(得分:0)

正如这里的几个答案所指出的,C ++ pre-0x不能使用本地类型作为模板参数。我通常做的是绕过这个问题(除了希望我工作的项目将很快转移到C ++ 0x)是将相应的本地类作为私有嵌套类放在需要这个仿函数的成员函数的类中。或者,我有时会将仿函数放在相应的.cpp文件中,想象它更干净(编译速度稍快)。

答案 3 :(得分:-1)

我认为这个问题的最佳答案是“使用functional编程语言”。