2012-07-06 77 views
4

這裏是類似於代理呼叫功能的源代碼,我在帖子「C++隱藏功能」中閱讀代理呼叫功能如何工作?

令我困惑的唯一部分是那些運算符重載函數。 他們是什麼樣的運營商? (他們當然似乎並不像普通的運算符()的,和爲什麼它返回一個函數指針,即使沒有指定返回類型?

謝謝!

template <typename Fcn1, typename Fcn2> 
class Surrogate { 
public: 
    Surrogate(Fcn1 *f1, Fcn2 *f2) : f1_(f1), f2_(f2) {} 

    // Overloaded operators. 
    // But what does this do? What kind of operators are they? 
    operator Fcn1*() { return f1_; } 
    operator Fcn2*() { return f2_; } 

private: 
    Fcn1 *f1_; 
    Fcn2 *f2_; 
}; 

void foo (int i) 
{ 
    std::cout << "foo: " << i << std::endl; 
} 

void bar (double i) 
{ 
    std::cout << "bar: " << i << std::endl; 
} 

int main() 
{ 
    Surrogate<void(int), void(double)> callable(foo, bar); 

    callable(10);  // calls foo 
    callable(10.1);  // calls bar 

    return 0; 
} 
+0

基本上這個類的一個實例可以用作Fcn1 *或Fcn2 *而不需要鑄造 – cppguy 2012-07-06 01:39:47

回答

7

他們是隱式類型轉換運算符爲Fcn1 *和Fcn2 *

在表達式「callable(10)」中,可調用函數被編譯器轉換爲帶有int參數的函數指針,使用Surrogate中定義的第一個類型轉換運算符。然後調用。

+0

謝謝!我會更多地瞭解隱式轉換運算符 – 2012-07-06 01:46:38

1

這些只是用戶定義的轉換運算符。用戶定義的轉換運算符是C++語言的基本功能,這意味着您可以在C++書籍或某些教程中閱讀它們。

語言規範的第12.3.2節描述了語法,但控制編譯器使用它們的規則分散在整個文檔中,並且相對廣泛。即這是不是可以或應該在SO帖子中解釋的東西。

尋找一本書。如果書中的某些內容不清楚,請回到這裏。

1

調用callable(10);實際上是*(callable.operator void(*)(int))(10);

編譯器發現在函數調用表達式中使用了callable。現在,對於一個函數調用表達式,編譯器會喜歡一個函數,函數指針或者帶有operator()的對象 - 就像你已經知道的那樣。

在這種情況下,callable都不是這些。但callable可以將轉換成爲其中之一,即爲函數指針。給定調用表達式,特別是參數int,重載分辨率選擇void(*)(int)