仿函数调用(附加字符)

时间:2011-06-01 09:04:48

标签: c++ call functor

我尝试构建一个最小的例子:

struct Functor
{
    void operator()(int& a)
    {
        a += 1;
    }
    void other(int& a)
    {
        a += 2;
    }
};

template <typename foo>
class Class
{
    public:
        void function()
        {
            int a = 10;
            foo()(a);
            std::cout << a << std::endl;
        }
};

int main()
{
    Class<Functor> c;
    c.function();
}

我的问题:为什么在没有对象的情况下调用纯类型的运算符?如何以与调用other相同的方式调用函数operator()

3 个答案:

答案 0 :(得分:8)

你不是在纯粹的类型上调用它。 foo()调用构造函数,并求值为临时foo对象,然后在其上调用operator()

要使用“普通”成员函数执行等效操作,只需执行以下操作:

foo().other(a);

答案 1 :(得分:3)

你没有“在没有对象的情况下调用纯类型的运算符”。语法foo()(a)正在创建类型foo的临时(这是foo()部分),然后使用operator()作为参数调用该对象上的a :( (a)部分。

答案 2 :(得分:2)

纯类型示例:

struct Functor
{
    void operator()(int& a)
    {
        a += 1;
    }
    void other(int& a)
    {
        a += 2;
    }
    static void one_more(int& a)
    {
        a += 3;
    }
};

template <typename foo>
class Class
{
    public:
        void function()
        {
            int a = 10;
            foo()(a);
            foo().other(a);
            foo::one_more(a);
            std::cout << a << std::endl;
        }
};

int main()
{
    Class<Functor> c;
    c.function();
}