1

我有一堂课

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喜欢

方法一:

func(fobj(1)); 

我要打印的消息已打印。

我一直在想我需要做一些类似的事情

方法二:

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() ?

4

2 回答 2

2

func(fobj(1)),从字面量 1fobj(1)创建一个临时对象。这个临时对象用于初始化函数参数(编译器可能会省略一个隐式副本),并在函数体中调用函数对象。fobjinttypeoperator()

我认为命名函数参数type有点误导。是作为函数参数的实例type的名称(在本例中为 a )。Tfobj

于 2010-05-14T23:45:48.780 回答
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
...

使用按引用传递确实允许函数能够修改对象的副作用。

于 2010-05-14T23:54:03.907 回答