2010-05-14 59 views
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

方法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

有一点需要注意的是,这个作品,因为你的模板类是由价值考虑的对象:

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 
... 

确实允许功能的副作用能够修改对象。

+0

张贴在堆栈溢出的一个优点是惊人的回复:)。谢谢 – 2010-05-15 00:14:47

2

func(fobj(1))fobj(1)创建从字面int 1.本临时一个temporay fobj用于初始化功能参数type(有一个隐含的副本编译器可能的Elid),并在功能operator()的主体被调用在函数对象上。

我认为命名函数参数type有点让人误解。 type是作为函数参数的T实例的名称(在本例中为fobj)。

相关问题