2010-05-14 60 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)。

相關問題