如何调用此函数对象?

时间:2010-05-14 23:42:00

标签: c++ functor

我有一个班级

class fobj{
public:
    fobj(int i):id(i) {}

    void operator()()
    {
        std::cout<<"Prints"<<std::endl;
    }

private:
    int id;
};

template<typename T>
void func(T type)
{
   type();
}

如果我像

那样调用func

方法1:

func(fobj(1)); 

打印我要打印的信息。

我一直以为我需要做像

这样的事情

方法2:

fobj Iobj(1); // create an instance of the fobj class
func(Iobj);   // call func by passing Iobj(which is a function object)

方法1如何运作?我是说究竟发生了什么?

如何在类fobj中调用operator()?

2 个答案:

答案 0 :(得分:2)

func(fobj(1))中,fobj(1)从文字fobj创建临时int 1.此临时用于初始化函数参数type(有一个在函数对象上调用函数operator()的正文中的编译器可能忽略的隐式副本。

我认为命名函数参数type有点误导。 typeT实例的名称(在本例中为fobj),它是函数参数。

答案 1 :(得分:2)

有一点需要注意,这是有效的,因为您的模板类按值获取对象:

template<typename T>
void func(T type)   // this takes a T by value
...

因此,它可以采用左值(例如实际变量)或右值(例如临时值)。

如果出于某种原因你确实希望将func限制为仅使用左值,则可以将函数修改为使用按引用传递:

template <typename T>
void func(T &type)  // this takes a T by reference
...

使用pass by reference确实允许函数的副作用能够修改对象。