仿函数调用(附加字符)

Dyi*_*oul 2 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();
}
Run Code Online (Sandbox Code Playgroud)

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

Oli*_*rth 8

你不是在纯粹的类型上调用它. foo()调用构造函数,并计算一个临时foo对象,然后在该对象上调用operator().

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

foo().other(a);
Run Code Online (Sandbox Code Playgroud)

  • @DyingSoul:是和否,因为你的结构是空的,并且因为方法是内联的,所以编译器很可能只是简单地执行"就地"方法中的代码(相当于替换`foo()(a)`使用`a + = 1`.如果你的方法不是内联的(无论出于何种原因),那么它必须在堆栈上保留一个字节(至少),因为需要将有效的地址传递给方法(`事实上,它并不知道你不需要它. (4认同)