2017-04-22 43 views
1

我的任務是實現我自己的std :: ref函數。我知道有一個reference_wrapper函數,它有助於std :: ref。但我怎麼能實現這些功能/類。我想到以下內容:C++ 11 std :: ref如何工作?

template <class T> 
struct myreference_wrapper{ 
    T& functor; 
    myreference_wrapper(T& t):functor(t){} 
    void operator()('parameter') { 
     functor('parameter'); 
    }; 
}; 

template<class T> 
myreference_wrapper<T> myref(T& t){ 
    myreference_wrapper<T> functor(t); 
    return functor; 
} 

當我們調用myref時,我們不能使用模板參數,因爲std :: ref不使用模板參數。但是當我們調用operator()時,我們需要知道它的參數,因爲我們想把它們傳遞給函數的操作符()(我用'參數'對它進行了簽名)。 std :: ref如何在沒有任何模板參數的情況下執行此操作?

+0

您可以嘗試爲'Callable'類型專門設置'myreference_wrapper'。 – Holt

+1

從什麼時候'std :: ref'不使用模板參數? – InternetAussie

+1

爲什麼你想重新發明輪子而不使用'std :: ref'? – zett42

回答

2

模板函數可以從調用函數的類型中推導出模板參數。例如:

template <class T> T min(T a, T b) { 
    return a < b ? a : b; 
} 

當你調用這個函數,你不需要指定模板參數:

int x = min(1, 2); 

編譯器着眼於類型的函數參數,認爲它們都是int並得出結論,它需要致電min<int>

爲您myref模板函數的調用同樣的事情:

int i; 
myref(i); 

同樣,編譯器會在函數參數的類型,看到它的int,並得出結論認爲,它需要調用myref<int>

另外,上面的min函數可能會稍微複雜一些。 min(1, 2.0)將不會編譯,因爲這兩個函數參數類型是不同的;一個是int,另一個是double,所以沒有T完全匹配兩者。這裏有幾種可能的解決方案。一種是重寫模板函數,使其具有兩個模板類型參數而不是一個:template <class T0, class T1> ??? min(T0, T1)。這導致設計問題:什麼是正確的返回類型?另一種解決方案是更改調用代碼以傳遞相同類型的參數。另一種是明確給出模板參數類型:min<int>(1, 2.0)。此代碼表示要調用min<int>,它採用int類型的兩個參數;該雙精度值將轉換爲int,就像非模板函數需要兩個值int一樣。

+1

我認爲OP的問題是關於'reference_wrapper'到'Callable'對象,它提供了一個'operator()'操作符,而OP詢問他如何爲這個'operator()'檢索參數(和返回類型) 'std :: ref'不使用這些。 – Holt